通信环境:以一台电脑作为客户端,另一台电脑当做服务器(也可以采用虚拟机实现) 客户端:
package work2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; //客户端 public class Client extends Thread{ Socket socket=null; public Client(String host,int port) { try { socket = new Socket(host, port); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { new sendMessThread().start(); super.run(); try { //读取数据 InputStream s=socket.getInputStream(); byte[] buf=new byte[1024]; int len=0; while((len=s.read(buf))!=-1) { System.out.println("Server said:"+new String(buf,0,len,"utf-8")); } if(buf.equals("byebye")) { s.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } //发送消息线程,将数据发送到socket里面 class sendMessThread extends Thread{ @Override public void run() { super.run(); Scanner sc=null; OutputStream os=null; try { sc=new Scanner(System.in); os=socket.getOutputStream(); String in=""; do { in = sc.next(); //将输入的数据写入到输出流 os.write(("" + in).getBytes()); //刷新此输出流并强制写出任何缓冲的输出字节。 os.flush(); } while (!in.equals("bye")); sc.close(); if(in.equals("bye")){ socket.close(); } } catch (IOException e) { e.printStackTrace(); } sc.close(); try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { //创建一个客户端,需要输入服务器的ip和端口 Client client=new Client("1.1.1.1", 9527); client.start(); } }服务器:
package work2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Server extends Thread { //定义服务器接口ServerSocket ServerSocket server=null; Socket socket=null; public Server(int port) { try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { super.run(); System.out.println("Server is waiting for connect"); try { //接收一个连接请求 socket=server.accept(); new sendMessThread().start();// 连接并返回socket后,再启用发送消息线程 System.out.println("remote Client " + socket.getInetAddress().getHostAddress() + " has connected successful"); InputStream in = socket.getInputStream(); int len = 0; byte[] buf = new byte[1024]; while ((len = in.read(buf)) != -1) { System.out.println("Client Said: (" + socket.getInetAddress().getHostAddress() + ")Said:" + new String(buf, 0, len, "UTF-8")); } } catch (IOException e) { e.printStackTrace(); } } //发送消息线程,将数据发送到socket里面 class sendMessThread extends Thread{ @Override public void run() { super.run(); Scanner sc=null; OutputStream os=null; try { sc=new Scanner(System.in); os=socket.getOutputStream(); String in=""; do { in = sc.next(); //将输入的数据写入到输出流 os.write(("" + in).getBytes("utf-8")); //刷新此输出流并强制写出任何缓冲的输出字节。 os.flush(); } while (!in.equals("hibye")); if(in.equals("hibye")) { try { sc.close(); os.close(); sendMessThread.interrupted(); socket.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { //创建一个服务器 Server server=new Server(9527); server.start(); } }测试: 先在服务器端运行服务器的代码,然后在客户端运行客户端的代码。