目录
网络模型结构
udp和tcp协议不互通
UDP协议
浏览器不能访问,浏览器用http协议,底层用tcp协议进行链接
//UDP先写服务器端
class UdpServer{
public static void main(String[] args) throws IOException {
//IP地址 端口号
System.out.println("udp服务启动。。。");
//创建服务器端口号,默认使用本机ip地址
DatagramSocket ds = new DatagramSocket(8080);
//服务器接收客户端1024字节
byte[] bytes = new byte[1024];
//定义数据包
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//接受客户端请求,将数据封装给数据包 如果客户端不给服务端发送请求,就一直阻塞
ds.receive(dp);
System.out.println("来源ip地址"+dp.getAddress()+"端口号"+dp.getPort());
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("服务器端接受客户端请求:::"+s);
ds.close();
}
}
public class UdpClient {
public static void main(String[] args) throws IOException {
System.out.println("udp客户端启动。。。");
//不传入端口号,作为客户端,创建一个socket客户端
DatagramSocket ds = new DatagramSocket();
String str="这个是客户端发过来的哟。。";
byte[] bytes = str.getBytes();
DatagramPacket ps = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("127.0.0.1"),8080);
ds.send(ps);
ds.close();
}
}
TCP协议
在TCP/IP协议中,TCP协议采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=J+1),同时自己也发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器V状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,
class TcpServer{
public static void main(String[] args) throws IOException {
System.out.println("socket tcp服务器端启动....");
ServerSocket serverSocket = new ServerSocket(8080);
// 等待客户端请求
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
// 转换成string类型
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String str = new String(buf, 0, len);
System.out.println("服务器接受客户端内容:" + str);
serverSocket.close();
}
}
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
System.out.println("socket tcp 客户端启动....");
Socket socket = new Socket("127.0.0.1", 8080);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("我是来测试的".getBytes());
socket.close();
}
}
使用线程池支持多个线程访问
class TcpServer{
public static void main(String[] args) throws IOException {
System.out.println("socket tcp服务器端启动....");
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(8080);
try {
while (true){
// 等待客户端请求
Socket accept = serverSocket.accept();
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = accept.getInputStream();
// 转换成string类型
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String str = new String(buf, 0, len);
System.out.println("服务器接受客户端内容:" + str);
//响应
OutputStream outputStream = accept.getOutputStream();
outputStream.write("服务器响应了 com.cn".getBytes());
}catch (Exception e){
}
}
});
}
}catch (Exception e){
}finally {
serverSocket.close();
}
}
}