TCP通信的几种方式

来源:互联网 发布:数据字典怎么用 编辑:程序博客网 时间:2024/06/05 18:14

1.一个客户端与一个服务器连接客户端给服务器发送hello服务器端接收并打印

服务端

package com.an.test.tcp;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class Server1 {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(8888);Socket socket = ss.accept();System.out.println("一个客户端连接上...");InputStream in = socket.getInputStream();byte[] b = new byte[1024];int len = -1;StringBuilder sb = new StringBuilder();while((len = in.read(b))!=-1){sb.append(new String(b,0,len));}System.out.println(sb);}}

客户端

package com.an.test.tcp;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;public class Client1 {public static void main(String[] args) throws Exception, IOException {Socket s = new Socket("127.0.0.1", 8888);   OutputStream out = s.getOutputStream();out.write("hello".getBytes());out.close();s.close();}}


2.一个客户端与一个服务器连接,客户端给服务器发送hello,服务器端接收并打印,然后把hello逆转后返回,客户端接收服务器返回的消息,并打印

服务端

package com.an.test.tcp2;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.rmi.server.SocketSecurityException;public class Server2 {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(9999);Socket socket = ss.accept();InputStream in = socket.getInputStream();int len = -1;byte[] b = new byte[1024];StringBuilder sb = new StringBuilder();while((len = in.read(b))!=-1){//读到流末尾,以后再也不传数据sb.append(new String(b,0,len));}System.out.println(sb);//返回,想客户端传入数据OutputStream out = socket.getOutputStream();out.write(sb.reverse().toString().getBytes());//断开in.close();out.close();}}

客户端

package com.an.test.tcp2;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class Client2 {public static void main(String[] args) throws Exception, IOException {Socket s = new Socket("127.0.0.1", 9999);OutputStream out = s.getOutputStream();out.write("hello".getBytes());//此时并没有写一个流末尾的标记,只有输出流关闭时,才会写一个流末尾的标记//out.close();//socket通道都关闭s.shutdownOutput();//只关闭输出流通道,不关闭输入流通道//就收服务器返回的内容InputStream in = s.getInputStream();byte[] b = new byte[1024];int len = -1;StringBuilder sb = new StringBuilder();while((len = in.read(b))!=-1){sb.append(new String(b,0,len));}System.out.println(sb);out.close();in.close();s.close();}}//Client:olleh//Server:hello

3.一个客户端与一个服务器连接,客户端可以从键盘输入消息,然后发送给服务器端,输入一行发送一行,直到输入bye结束。服务器端接收到一行就打印,即实现一个客户端多次与服务器通信

服务端

package com.an.test.tcp3;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class Server3 {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(7777);Socket socket = ss.accept();InputStream in = socket.getInputStream();//字节流对去 -1结尾,不能用/*int len = -1;byte[] b = new byte[1024];StringBuilder sb = new StringBuilder();while((len = in.read(b))!=-1){sb.append(new String(b,0,len));}System.out.println(sb);*/BufferedReader br = new BufferedReader(new InputStreamReader(in));String str;while((str = br.readLine())!=null){System.out.println(str);}in.close();ss.close();}}

客户端

package com.an.test.tcp3;import java.io.IOException;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner;public class Client3 {public static void main(String[] args) throws Exception, IOException {Socket s = new Socket("127.0.0.1", 7777);OutputStream out = s.getOutputStream();Scanner in = new Scanner(System.in);//这里是循环输入,所以在服务端不能用字节来读取,要用字符流一行一行的读取//方法一/*while(true){String str = in.next();if(str.equals("bye")){break;}out.write((str+"\n").getBytes());}*///方法2/*while(in.hasNextLine()){String str = in.nextLine();if(str.equals("bye")){break;}out.write((str+"\n").getBytes());}*///方法3PrintStream ps = new PrintStream(out);while(in.hasNextLine()){String message = in.nextLine();ps.println(message);if(message.equals("bye")){break;}}out.close();}}

4.多个客户端与一个服务器连接,客户端可以从键盘输入消息,然后发送给服务器端,输入一行发送一行,直到输入bye结束。服务器端接收到一行就打印。。即实现多个客户端多次与服务器通信

服务端

package com.an.test.tcp4;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class Server4 {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(6666);//服务器一直在监听客户端的连接,可以连接无数个while(true){//监听一个客户端的连接Socket socket = ss.accept();new Thread(){//一个线程要做的事,接受一个客户端的消息public void run() {//接受客户端的消息try(InputStream in = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));){String str;while((str=br.readLine())!=null){System.out.println(str);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}.start();}}}

客户端

package com.an.test.tcp4;import java.io.IOException;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner;public class Client4 {public static void main(String[] args) throws Exception, IOException {Socket s = new Socket("127.0.0.1", 6666);OutputStream out = s.getOutputStream();Scanner in = new Scanner(System.in);PrintStream ps = new PrintStream(out);while(in.hasNextLine()){String str = in.nextLine();ps.println(str);if(str.equals("bye")){break;}}out.close();s.close();in.close();}}

5.一个服务器负责维护多人聊天效果,即多个客户端同时在线聊天的效果


客户端要从键盘输入消息,给大家发(本质上是通过服务器转发的,因此它先发给服务器),直到bye结束


A客户端发送的消息,服务器收到后负责给B,C,D等所有在线客户端转发


A客户端同时可以发消息,也可以收消息,“同时”进行


服务器“同时”接受多个客户端的连接


服务端

package com.an.test.tcp5;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;public class Server5 {//记录所有在线人员private static ArrayList<Socket> online = new ArrayList<Socket>();public static void main(String[] args) throws IOException {//开启服务器ServerSocket ss = new ServerSocket(7979);while(true){Socket accept = ss.accept();//将上线成员添加到online中online.add(accept);sendOthers(accept,"上线啦!");//每一个客户端都要有单独的线程来维护通信new Thread(){public void run() {try(InputStream in = accept.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));) {String str;while((str=br.readLine())!=null){System.out.println(str);//发给其他客户端sendOthers(accept,str);if(str.equals("bye")){break;}}} catch (Exception e) {//如果当前客户端通信异常//应该把当前客户端移除sendOthers(accept, "掉线啦!");}//从online中移除当前的客户端online.remove(accept);}}.start();}}private static void sendOthers(Socket self, String message){ArrayList<Socket> offline = new ArrayList<Socket>();String ip = self.getInetAddress().getHostAddress();//本客户端的IP地址//遍历所有的在线客户端for(Socket s:online){if(!s.equals(self)){//群发消息时,自己是收不到的,不是自己才能收到try{OutputStream out = s.getOutputStream();PrintStream ps = new PrintStream(out);if("bye".equals(message)){ps.println(ip+"下线了");}else{ps.println(ip+"说:"+message);}} catch (IOException e) {offline.add(s);}}}for(Socket s:offline){online.remove(s);}}}

客户端

package com.an.test.tcp5;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.net.SocketException;import java.util.Scanner;public class Client5 {public static void main(String[] args) throws Exception, IOException {Socket socket = new Socket("127.0.0.1", 7979);// 2.收消息和发消息是“同时”进行的// 发消息要一个线程维护,收消息也要一个线程维护// 发消息Thread t = new Thread() {public void run() {try (Scanner input = new Scanner(System.in);OutputStream out = socket.getOutputStream();PrintStream ps = new PrintStream(out);) {while (input.hasNextLine()) {String str = input.nextLine();ps.println(str);if (str.equals("bye")) {break;}}} catch (Exception e) {return;}}};t.start();new Thread(){//负责收消息public void run() {try (InputStream in = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));){String str;while((str=br.readLine())!=null){System.out.println(str);}}catch(SocketException e){return ;} catch (IOException e) {// TODO Auto-generated catch blockreturn;}}}.start();t.join();socket.close();}}


原创粉丝点击