//服务器端代码
import java.io.*;
import java.net.*;

public class ServerTest3{
  public static void main(String[] args){
    try{
      //设置sever端的链接
      ServerSocket s = new ServerSocket(8888);
      Socket s1 = s.accept();//sever等待链接
      
      //实例化输出流
      OutputStream os = s1.getOutputStream();
      DataOutputStream dos = new DataOutputStream(os);
      //实例化输入流
      InputStream is = s1.getInputStream();
      DataInputStream dis = new DataInputStream(is);
      //实例化两个线程的对象
      Thread msr = new MyServerReader(dis);
      Thread msw = new MyServerWriter(dos);
      //启动线程
      msr.start();
      msw.start();
    }
    //捕获异常
    catch(SocketException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
//创建一个进程用来进行接收读取数据
class MyServerReader extends Thread{
  private DataInputStream dis;
  public MyServerReader (DataInputStream dis){
    this.dis = dis;
  }
  public void run(){
    String msg;
    try{
      while(true){
        msg = dis.readUTF();
        System.out.println("对方说:" + msg);
        if(msg.equals("bye")){
          System.out.println("对方下线,程序退出");
          System.exit(0);
        }
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
//创建一个进程用来写入并发送数据
class MyServerWriter extends Thread{
  private DataOutputStream dos;
  public MyServerWriter(DataOutputStream dos){
    this.dos = dos;
  }
  public void run(){
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    String msg;
    try{
      while(true){
        msg = br.readLine();
        dos.writeUTF(msg);
        if(msg.equals("bye")){
          System.out.println("自己下线,程序退出");
          System.exit(0);
        }
      }
      }catch(IOException e){
      System.out.println(e);
    }
  }
}

//客户端代码
import java.io.*;
import java.net.*;

public class ClientTest3{
  public static void main(String[] args){
    try{
      //链接sever端
      Socket s1 = new Socket("127.0.0.1",8888);
      //实例化输入流
      InputStream is = s1.getInputStream();
      DataInputStream dis = new DataInputStream(is);
      //实例化输出流
      OutputStream os = s1.getOutputStream();
      DataOutputStream dos = new DataOutputStream(os);
      //实例化两个进程
      Thread mcr = new MyClientReader(dis);
      Thread mcw = new MyClientWriter(dos);
      //启动两个进程
      mcr.start();
      mcw.start();
      //捕获异常
    }catch(SocketException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }  
  }
}
//创建一个进程用来进行接收读取数据
class MyClientReader extends Thread{
  private DataInputStream dis;
  public MyClientReader(DataInputStream dis){
    this.dis = dis;
  }
  @Override
  public void run(){
    String msg;
    try{
      while(true){
      msg = dis.readUTF();
      System.out.println("对方说:"+msg);
      if(msg.equals("bye")){
        System.out.println("对方下线,程序退出");
        System.exit(0);
      }
    }
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
//创建一个进程用来写入并发送数据
class MyClientWriter extends Thread{
  private DataOutputStream dos;
  public MyClientWriter(DataOutputStream dos){
    this.dos = dos;
  }
  @Override
  public void run(){
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    String msg;
    try{
    while(true){
      msg = br.readLine();
      dos.writeUTF(msg);
      if(msg.equals("bye")){
        System.out.println("自己下线,程序退出");
        System.exit(0);
      }
    }
    }catch(IOException e){
      System.out.println(e);
    }
  }
}

打开两个控制台,先运行服务器端代码,再运行客户端代码,然后两端可以进行自由的通话