一、定义简介:
1. TCP是一个面向连接的、可靠的协议(transmission control protocol)
专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
2. UDP是一个无连接,不可靠的协议(user datagram protocol )
数据的发送方只负责将数据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。
3. Socket编程:Socket客户/服务器程序开发
所谓的客户/服务器,是一种在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。该通信模型首先在客户机和服务器之间定义一套通信协议,并创建一Socket(套接字)类,利用这个类建立一条可靠的链接;然后,客户/服务器再在这条连接上可靠地传输数据。客户端发出请求,服务器监听来自客户机地请求,并为客户端 提供响应服务。这就是典型的“请求-应答”模式。
二、简单通信实践:直接上代码,可直接运行
1. TCP通信,需要创建两个类,一个是客户端(Client),一个是服务器端(Server)
(1)Client类:
public class Client {
public static void main (String [] args){
//创建客户端对象
System.out.println("客户端启动~");
try {
Socket socket=new Socket("127.0.0.1",23456);
OutputStream out=socket.getOutputStream();
PrintWriter pw=new PrintWriter(out);
System.out.println("客户端:");//客户端写入
Scanner sc=new Scanner(System.in);
pw.println(sc.nextLine());
pw.flush();
InputStream in=socket.getInputStream();//客户端接收
InputStreamReader inr=new InputStreamReader(in);
BufferedReader bf=new BufferedReader(inr);//字符读取
String s=bf.readLine();
System.out.println(s);
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)Server类:
public class Server {
public static void main(String [] args) throws IOException{
//创建服务端接收
System.out.println("服务端启动~");
ServerSocket server=new ServerSocket(23456);
Socket socket=server.accept();//接收客户端
InputStream in=socket.getInputStream();//接收字节流数据
InputStreamReader inr=new InputStreamReader(in);
BufferedReader bf=new BufferedReader(inr);//字符流读取
String s=bf.readLine();
System.out.println(s);
OutputStream out=socket.getOutputStream();
PrintWriter pw=new PrintWriter(out);
System.out.println("客户端:");//客户端写入
Scanner sc=new Scanner(System.in);
pw.println(sc.nextLine());//注意使用换行方法
pw.flush();//可以释放资源也可以不释放资源,最后再关闭流
server.close();
socket.close();
}
}
2. UDP通信,也需要创建两个类,一个是客户端(UDP_Client),一个是服务端(UDP_Server)
(1)UDP_Client类:
public class UDP_Client {
public static void main(String [] args) throws SocketException, UnknownHostException{
System.out.println("客户端启动~~");
DatagramSocket socket=new DatagramSocket();//创建socket通道
System.out.println("请输入发送信息:");
Scanner sc=new Scanner(System.in);
String s=sc.next();
byte[]by=s.getBytes();
DatagramPacket packet=new DatagramPacket(by, 0,by.length, //创建packet包
InetAddress.getByName("127.0.0.1"), 10087);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
}
}
(2)UDP_Server类:
public class UDP_Server {
public static void main(String [] args) throws SocketException{
DatagramSocket socket = new DatagramSocket(10087);
System.out.println("服务端启动~~");
byte[]by=new byte[socket.getReceiveBufferSize()];//获取缓冲区长度
DatagramPacket packet = new DatagramPacket(by, by.length);//创建数据包对象
try {
socket.receive(packet);
String message=new String(by,0,by.length);
System.out.println(message);
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
}
}
三、注意事项:
1.TCP通信和UDP通信都是先启动服务端,然后再启动客户端,然后才可以进行通信;
2. 以上的TCP通信和UDP通信分别属于不同的代码块,可按需复制需要的代码块;