本文共 2883 字,大约阅读时间需要 9 分钟。
前两天,开始做一个简单的客户端与服务器进行聊天的程序,但是发现很多大佬写的以及视频教程中,仅仅是单向交流(只能由客户端向服务端发送消息,服务端打印输出),后来我用一个循环在两者代码互相加了一点代码,解决了这个毛病,但是又有了新的问题,只能由一方发送,一方接受,接收完才可以进行下面的任务,无限的等待啊,啊啊啊
在一番摸索,线程这两字频频的出现在我的眼前!我的问题也在其慢慢解决! 此文章也是用线程初次完善。服务器代码:
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 Server { public static void main(String[] args) { ServerSocket server; Socket socket; try { server=new ServerSocket(5252); socket = server.accept(); In ta=new In(socket); Out te=new Out(socket); new Thread(ta).start(); new Thread(te).start(); } catch (IOException e) { e.printStackTrace(); } } }
客户端代码:
import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner; public class Client { public static void main(String[] args) { Socket socket; try { socket = new Socket("localhost",5252); In ta=new In(socket); Out te=new Out(socket); new Thread(ta).start(); new Thread(te).start(); } catch (UnknownHostException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } }}
因为客户端与服务器端都有相同的功能,实现起来也是完全一致,这个也是文章的重点,使用接口Runnable,一个是输出流,一个输入流实现,可写,可读
In类:
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;public class In implements Runnable { private Socket socket; public In(Socket socket) { this.socket=socket; } public void run() { // TODO 自动生成的方法存根 try { InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); while(true){ System.out.println("客户端说:" + br.readLine()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
Out类:
import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;public class Out implements Runnable{ Scanner sc=new Scanner(System.in); private Socket socket; public Out(Socket socket) { this.socket=socket; } @Override public void run() { // TODO 自动生成的方法存根 while(true) { OutputStream out; try { out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8"); PrintWriter pw = new PrintWriter(osw, true); //创建Scanner读取用户输入内容 Scanner scanner = new Scanner(System.in); String ft=null; while(true){ ft=sc.next(); pw.println(scanner.nextLine()); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }}
启发大佬
转载地址:http://rarwi.baihongyu.com/