标签:int 客户端连接 span font 之间 stream vat output out
服务端和单客户端通信
注意事项:如果服务端或者客户端采用read() 一个字节这种读取数据,只要另一方没有关闭连接,read是永远读取不到-1,会陷入死循环中;
解决方法:加上一个判断,程序员自己跳出循环,比如在while循环中,加上
if(strbuilder.indexOf("\n") > 0){//存在消息结束标志 break; }
服务端代码
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8080); Socket socket = server.accept(); System.out.println("客户端连接成功:"+server.getInetAddress().getHostAddress()); BufferedReader bufRead = new BufferedReader(new InputStreamReader(socket.getInputStream())); String s = bufRead.readLine(); System.out.println("message="+s); BufferedWriter bufwrite = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bufwrite.write("你好我是服务端\n"); bufwrite.flush(); bufwrite.close(); bufRead.close(); } catch (IOException e) { e.printStackTrace(); } } }
客户端代码
import java.io.*; import java.net.Socket; public class client { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",8080); BufferedWriter bufWrite = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //如果服务器使用readline来读取数据,那么发送的数据后面必须加上\n; bufWrite.write("你好我是客户端\n"); bufWrite.flush(); //PrintStream ps = new PrintStream(new BufferedOutputStream(socket.getOutputStream())); //ps.println("dddd"); //ps.flush(); BufferedReader bufread = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(bufread.readLine()); //ps.close(); bufWrite.close(); bufread.close(); } catch (IOException e) { e.printStackTrace(); } } }
服务器和多客户端通信
即采用多线程的方式进行处理任务
服务端
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Server { public static void main(String[] args) { try { ExecutorService es = Executors.newFixedThreadPool(4); ServerSocket server = new ServerSocket(8080); while (true){ Socket socket = server.accept(); System.out.println("有客户端连接"); es.execute(new ServerHandle(socket)); } } catch (IOException e) { e.printStackTrace(); } } } class ServerHandle implements Runnable{ private Socket socket; public ServerHandle(Socket socker){ this.socket = socker; } @Override public void run() { BufferedReader bufRead = null; try { bufRead = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); char[] chars = new char[1024]; StringBuilder strbuilder = new StringBuilder(); int len=-1; while ((len=bufRead.read(chars))!=-1){ strbuilder.append(new String(chars),0,len); if(strbuilder.indexOf("\n") > 0){//存在消息结束标志 break; } } System.out.println("message="+ strbuilder); BufferedWriter bufwrite = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bufwrite.write("已经收到你的信息:"+strbuilder+"\n"); bufwrite.flush(); } catch (IOException e) { e.printStackTrace(); } } }
客户端
import java.io.*; import java.net.Socket; import java.util.Scanner; public class client { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",8080); BufferedWriter bufWrite = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //如果服务器使用readline来读取数据,那么发送的数据后面必须加上\n; Scanner input = new Scanner(System.in); System.out.println("输入一个发送的信息"); String x = input.next(); bufWrite.write(x+"\n"); bufWrite.flush(); BufferedReader bufread = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(bufread.readLine()); bufWrite.close(); bufread.close(); } catch (IOException e) { e.printStackTrace(); } } }
多客户端之间的通信
标签:int 客户端连接 span font 之间 stream vat output out
原文地址:https://www.cnblogs.com/yanxiaoge/p/10740302.html