java中TCP与UDP协议的使用以及多线程服务器编写

xiaoxiao2021-02-28  23

TCP协议使用

客户端服务器代码:

package xdl.day19; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class TestServer { public static void main(String[] args) { try{ //1.创建ServerSocket类型的对象,并绑定指定的端口 ServerSocket ss=new ServerSocket(8888); System.out.println("等待客户端的连接请求..."); Socket s=ss.accept(); System.out.println("客户端连接成功!"); //2.等待客户端的连接请求,调用accept()方法 //3.得到Socket类型的对象,使用输入输出流进行通信 //使用BufferReader类来接受客户端发来的内容 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); String str=br.readLine(); System.out.println("客户端发来的数据为:"+str); //4.关闭相关的资源 s.close(); ss.close(); }catch(Exception e){ e.printStackTrace(); } } }

客户端代码

package xdl.day19; import java.io.PrintStream; import java.net.Socket; public class TestClient { public static void main(String[] args) { try{ //1.创建Socket类型的对象,并提供服务器IP地址和端口号 Socket s=new Socket("169.254.167.40",8888); //2.使用输入输出流进行通信 //使用PrintStream类向服务器发送字符串内容“hello” PrintStream ps=new PrintStream(s.getOutputStream()); ps.println("hello"); System.out.println("成功发送数据到服务器"); //3.关闭相关的资源 ps.close(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }

练习:

要求客户端发送的内容由用户手动输入,使用BufferedReader类。要求服务器收到客户端的消息之后,向客户端回发消息“I Receieved!”要求服务器和客户端可以不断进行通信,当客户端发送“bye”时结束通信。

- 要求服务器能够同时支持多个客户端的连接,而且能够和多个客户端同时聊天,多线程。

服务线程

package xdl.day19; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class ServerThread extends Thread { private Socket s; public ServerThread(Socket s){ this.s=s; } @Override public void run(){ try{ //只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终接待 //2.等待客户端的连接请求,调用accept()方法 //3.得到Socket类型的对象,使用输入输出流进行通信 //使用BufferedReader类来接受客户端发来的内容 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); PrintStream ps=new PrintStream(s.getOutputStream()); while(true){ String str=br.readLine(); if("bye".equalsIgnoreCase(str))break; System.out.println("客户端发来的数据为:"+str); //向客户端回发消息 //使用PrintStream类向服务器发送字符串内容“I Received!” ps.println("I Received!"); System.out.println("成功发送数据到客户端!"); } //4.关闭相关的资源、 ps.close(); br.close(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }

服务器

package xdl.day19; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class TestServer { public static void main(String[] args) { try{ //1.创建ServerSocket类型的对象,并绑定指定的端口 ServerSocket ss=new ServerSocket(8888); while(true){ System.out.println("等待客户端的连接请求..."); Socket s=ss.accept(); System.out.println("客户端"+s.getInetAddress()+"连接成功!"); //只要有客户端连接成功,则应启动一个新线程为之服务,主线程始终进行接待 new ServerThread(s).start(); } //ss.close(); }catch(Exception e){ e.printStackTrace(); } } }

客户端

package xdl.day19; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class TestClient { public static void main(String[] args) { try{ //1.创建Socket类型的对象,并提供服务器IP地址和端口号 Socket s=new Socket("169.254.167.40",8888); //2.使用输入输出流进行通信 //提示用户输入要发送的内容,并使用变量记录 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); PrintStream ps=new PrintStream(s.getOutputStream()); BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream())); while(true){ System.out.println("请输入要发送的内容:"); String str=br.readLine(); //使用PrintStream类向服务器发送字符串内容“hello” ps.println(str); System.out.println("成功发送数据到服务器"); //使用BufferReader类来接受客户端发来的内容 String str2=br2.readLine(); if(str2.equalsIgnoreCase(str2))break; System.out.println("服务器发来的数据为:"+str2); } //3.关闭相关的资源 br.close(); br2.close(); ps.close(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }

UDP协议使用

接收方

package xdl.day19; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class TestClient { public static void main(String[] args) { try{ //1.创建Socket类型的对象,并提供服务器IP地址和端口号 Socket s=new Socket("169.254.167.40",8888); //2.使用输入输出流进行通信 //提示用户输入要发送的内容,并使用变量记录 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); PrintStream ps=new PrintStream(s.getOutputStream()); BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream())); while(true){ System.out.println("请输入要发送的内容:"); String str=br.readLine(); //使用PrintStream类向服务器发送字符串内容“hello” ps.println(str); System.out.println("成功发送数据到服务器"); //使用BufferReader类来接受客户端发来的内容 String str2=br2.readLine(); if(str2.equalsIgnoreCase(str2))break; System.out.println("服务器发来的数据为:"+str2); } //3.关闭相关的资源 br.close(); br2.close(); ps.close(); s.close(); }catch(Exception e){ e.printStackTrace(); } } }

发送方

package xdl.day19; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class TestSend { public static void main(String[] args) { try{ //1.创建DatagramSocket类型的对象 DatagramSocket ds=new DatagramSocket(); //2.创建DatagramPacket类型的对象,用于接收数据内容 byte[] data="hello".getBytes(); DatagramPacket dp=new DatagramPacket(data,data.length, InetAddress.getLocalHost(),8888); ds.send(dp); System.out.println("成功发送数据内容!"); //4.关闭套接字 ds.close(); ///2.创建DatagramPacket类型的对象,提供接收方的IP地址和端口号 //3.发送数据内容,使用send()方法 //4.关闭套接字 }catch(Exception e){ e.printStackTrace();} } }

注意事项:

打印格式出现问题:

解决办法:控制字符串长度,是占位符的原因。

System.out.println("接收到的数据内容是:"+new String(data,0,dp.getLength())+"!");
转载请注明原文地址: https://www.6miu.com/read-2626551.html

最新回复(0)