1. UDP
DatagramSocket类:
- send()与receive()方法
- 绑定一个IP和Port
DatagramPacket类:
- 集装箱机制:封装数据
- 地址标签:目的地IP+目的地Port
接收方必须先于发送方运行
import java.net.*;
public class send//发送端
{
public static void main(String [] args) throws Exception
{
DatagramSocket ds=new DatagramSocket();
String str="hello world";
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
InetAddress.getByName("127.0.0.1"),3000);
System.out.println("Send: 准备发送信息");
ds.send(dp);
System.out.println("Send: 发送信息结束");
ds.close();
}
}
import java.net.*;
public class receive//接收端
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(3000);
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
System.out.println("Recv: 我在等待信息");
ds.receive(dp);//阻塞,等待发送端连接
System.out.println("Recv: 我接收到信息");
String strRecv=new String(dp.getData(),0,dp.getLength()) +
" from " + dp.getAddress().getHostAddress()+":"+dp.getPort();
ds.close();
}
}
2. TCP
TCP协议:有链接、保证可靠的无误差通讯:
- 服务器:创建一个ServerSocket,等待连接
- 客户机:创建一个Socket,连接到服务器
- 服务器:ServerSocket接收到连接,创建一个Socket和客户的Socket建立专线连接,后续服务器和客户机的对话(这一对Socket)会在一个单独的线程(服务器端)上运行。
- 服务器的ServerSocket解除与客户端连接,处于阻塞状态,继续等待连接,返回第一步。
ServerSocket:等待响应的服务器端口:
- 需要绑定port,IP
Socket:运输通道:
- 客户端需要绑定服务器的IP和Port
- 客户端往Socket输入流写入数据,送到服务端
- 客户端从Socket输出流取服务器端过来的数据
- 同一个通道,服务端的输出流就是客户端的输入流;服务端的输入流就是客户端的输出流
import java.net.*;
import java.io.*;
public class TcpServer
{
public static void main(String [] args)
{
try
{
ServerSocket ss=new ServerSocket(8001); //服务端Socketserver在8001端口监听
Socket s=ss.accept(); //阻塞,等到有客户端Socket连接new Socket()
System.out.println("i am server");
//InputStream ips=s.getInputStream(); //使用socket.getInputStream()获取输入流
OutputStream ops=s.getOutputStream(); //使用socket.getOutputStream()获取输出流
ops.write("Hello, Client!".getBytes()); //输出流write()
//ips.close();
ops.close();
s.close();
ss.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
try {
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8001); //建立一个socket连接
System.out.println("i am client");
InputStream ips = s.getInputStream(); //使用socket.getInputStream()获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(ips));//包装
System.out.println("Server said: " + br.readLine());//使用BufferRead的readline()读取避免乱码
br.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}