什么是网络? 网络是主机之间的数据的传输
第一点: 主机
IP地址 :用于定位主机
第二点: 程序
端口port:用于标识主机上的应用程序
第三点:规则–协议
Tcp:面向连接 打电话`确定连接成功后,必须的到回复,连接成功 三次握手
Udp:面向无连接 邮寄信件 只负责发送不管是否收到 效率快
2.java支持网络编程
基于TCP协议:打电话 ,下载
客户端和服务端
ServerSocket
Socket
B/S Browser/Server 游览器与服务端
C/S Client/Server 客户端与服务端
基于UDP协议:发邮件
DatagramSocket
DatagramPacket
Tcp客户端和服务端简单操作步骤
服务端
1.创建服务连接
2.当客户端发起连接请求,唤醒accept()方法,获取Socket对象
3.通过Socket对象,可以获取字节输入输出流
4.进行流操作
5.关闭服务和流
客户端
1.创建服务连接
2.通过Socket对象,可以获取字节输入输出流
3.进行流操作
4.关闭服务和流
UDP
发送端
1.创建服务
2.将要发送的数据打包成数据包
3.发送数据包
4.关闭服务和流
接收端
1.创建服务
2.用空的数据包接收数据
3.分析数据
4.关闭流和服务
下面是代码示例
package com.ds.homework;
import java.awt.datatransfer.StringSelection;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @author 董硕:
* @version 创建时间:2017年8月15日 下午10:01:24
* udp发送端
*/
public class SendClass {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//建立udp服务
DatagramSocket socket=new DatagramSocket();
//要发送的数据,打成数据包
String string="这是一个udp传输";
DatagramPacket datagramPacket=new DatagramPacket(string.getBytes(),string.getBytes().length ,InetAddress.getByName("10.0.127.247" ), 6666);
//发送数据包给接收端
socket.send(datagramPacket);
//关闭服务
socket.close();
}
}
package com.ds.homework;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @author 董硕:
* @version 创建时间:2017年8月15日 下午10:13:02
* 接收端 ,接收数据
*/
public class ReceiveClass {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//建立接收端服务
DatagramSocket datagramSocket=new DatagramSocket(6666);
//创建一个空数据包来接收数据
byte[]by=new byte[63];
DatagramPacket datagramPacket=new DatagramPacket(by, by.length);
//接收数据包
datagramSocket.receive(datagramPacket);
//将数据包内容打印到控制台上
String string=new String(by, 0, datagramPacket.getLength());
System.out.println(string);
//关闭服务
datagramSocket.close();
}
}
下面是简单的利用TCP协议,编写的聊天程序,要求
通过TCP协议实现无限对话,然后存储到文件当中,chat.txt
package com.ds.homework;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author 董硕:
* @version 创建时间:2017年8月15日 下午4:30:57
* 通过TCP协议实现无限对话,然后存储到文件当中,chat.txt
* 在循环里面 有1.从控制台读取字符 2.发送给客户端 并写入文本中 3.显示客户端发送的文本
*/
public class ServerClass {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket serverSocket=new ServerSocket(12306);//tcp建立服务
System.out.println("服务器等待客户连接.......");
Socket socket=serverSocket.accept();//accept是阻塞方法
System.out.println("连接成功");
BufferedReader inputStreamReader=new BufferedReader(new InputStreamReader(System.in));
BufferedReader inputStreamReader2=new BufferedReader(new InputStreamReader(socket.getInputStream()));
// BufferedWriter outputStreamWriter2=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
OutputStreamWriter outputStreamWriter2=new OutputStreamWriter(socket.getOutputStream());
FileWriter fileWriter=new FileWriter("D:\\JAVA\\chat.txt",true);
System.out.println("duqudao");
while(true){
//读取客户端发送的数据,并打印到控制台
String string2=inputStreamReader2.readLine();
System.out.println("客户端:"+string2+"ip地址"+socket.getInetAddress());
//读取控制台输入的字符串
String string=inputStreamReader.readLine();
if("over".equals(string))
{
System.out.println("退出服务端");
break;
}
//将控制台输入的数据发送给客户
outputStreamWriter2.write(string+"\r\n");
// outputStreamWriter2.newLine();
outputStreamWriter2.flush();
//并写入到文本中
fileWriter.write("服务器:"+string+"\r\n");
fileWriter.flush();
}
inputStreamReader.close();
inputStreamReader2.close();
fileWriter.close();
outputStreamWriter2.close();
socket.close();
}
}
package com.ds.homework;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author 董硕:
* @version 创建时间:2017年8月15日 下午5:20:50
* 1.读取控制台字符串 2.读取服务器发送数据到控制台 3.将读取到的控制台字符串写入到文本中
*/
public class ClientClass {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Socket socket=new Socket(InetAddress.getByName("10.0.127.247"), 12306);
System.out.println("客户端建立连接");
BufferedReader inputStreamReader=new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(socket.getOutputStream());
BufferedReader inputStreamReader2=new BufferedReader(new InputStreamReader(socket.getInputStream()));
FileWriter fileWriter=new FileWriter("D:\\JAVA\\chat.txt",true);
while(true){
System.out.println("客户请输入:");
//读取控制台输入
String string=inputStreamReader.readLine();
if("over".equals(string))
{
System.out.println("客户端结束");
break;
}
outputStreamWriter.write(string+"\r\n");
// outputStreamWriter.newLine();
outputStreamWriter.flush();
//将控制台输入内容写入文本,并发给服务器
fileWriter.write("客户端"+string+"\r\n");
fileWriter.flush();
//读取服务器端内容
//System.out.println(string);
String string2=inputStreamReader2.readLine();
//将读到内容写到控制台
System.out.println("服务器端:"+string2);
}
inputStreamReader.close();
inputStreamReader2.close();
outputStreamWriter.close();
socket.close();
}
}