客户端代码
import java.awt.BorderLayout;
import java.awt.Button;import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client extends JApplet implements Runnable{
private static Socket socket = null;
private static Socket socket1 = null;
private JTextField jtf=new JTextField();
 
Button send = new Button("send");private JTextArea jta=new JTextArea();
private DataInputStream fromServer=null;
private DataOutputStream toServer=null;
public void init()
{ connectToServer();
jtf.setText("e"); 
JPanel p=new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Enter Text"),BorderLayout.WEST);
p.add(jtf,BorderLayout.CENTER);
p.add(send,BorderLayout.EAST);
jtf.setHorizontalAlignment(JTextField.LEFT);
setLayout(new BorderLayout());
add(p,BorderLayout.NORTH);
add(new JScrollPane(jta),BorderLayout.CENTER);
send.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//String message1=jtf.getText();
  if(e.getSource()==send) {
try{
String message1=null;
message1=jtf.getText().trim();
toServer=new DataOutputStream(socket.getOutputStream());
toServer.writeUTF(message1);

}catch(IOException ex){ ex.printStackTrace();  
}
}
}

});
//jtf.addActionListener(new TextFieldListener());
//connectToServer();
 new Thread(this).start();
}
public void connectToServer()
{
try{

 socket=new Socket("localhost",8000);
socket1=new Socket("localhost",7999); } catch(Exception ex){
System.err.println(ex);
}


}

//创建一个专门用于发送消息的线程
   public void run() {
        //专门用于接收消息
        //DataInputStream in;
        String str=null;
    

        while(true) {
            try {
               
             fromServer = new DataInputStream(socket1.getInputStream());
                 str = fromServer.readUTF();
                jta.append("Received frome Server is "+str+'\n');
            }catch(Exception e) {}
        }
    }

}
服务端代码
import javax.swing.JFrame;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.util.Date;public class Server extends JFrame implements TicTacToeConstants{
public static void main(String[] args)
{
Server frame=new Server();

}
public Server()
{
 JTextArea jtaLog =new JTextArea();
JScrollPane scrollPane=new JScrollPane(jtaLog);
add(scrollPane,BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,300);
setTitle("Server");
setVisible(true);
try
{
ServerSocket serversocket=new ServerSocket(8000);
ServerSocket serversocket1=new ServerSocket(7999);
jtaLog.append(new Date()+":Server started at socket 8000\n");
int session=1;
while(true)
{
jtaLog.append(new Date()+":wait for players to join session"+session+'\n');
//connect to play1
Socket player1=serversocket.accept();
//新添加的
Socket player11=serversocket1.accept();
jtaLog.append(new Date()+"player1 joined session"+session+'\n');
jtaLog.append(":player1's IP address"+
player1.getInetAddress().getHostAddress()+'\n');
//new DataOutputStream(player1.getOutputStream()).writeInt(PLAY1);
//connect to play2
Socket player2=serversocket.accept();
//新添加的
Socket player22=serversocket1.accept();

jtaLog.append(new Date()+"player2 joined session"+session+'\n');
jtaLog.append(":player2's IP address"+
player2.getInetAddress().getHostAddress()+'\n');
//new DataOutputStream(player2.getOutputStream()).writeInt(PLAY1);
//显示这个回话
jtaLog.append(new Date()+":Start a thread for session"+
session++ +'\n');
//创建一个线程给这个回话来处理两个玩家
HandleSession task=new HandleSession(player1,player2,player11,player22);
new Thread().start();

}

}catch(IOException ex){System.err.println(ex);}


}
class HandleSession implements Runnable,TicTacToeConstants{
private Socket player1;
private Socket player2;
//新添加
private Socket player11;
private Socket player22;
private DataInputStream fromPlayer1;
private DataOutputStream toPlayer1;
private DataInputStream fromPlayer2;
private DataOutputStream OutPlayer2;
public HandleSession(Socket player1,Socket player2,Socket player11,Socket player22){
this.player1=player1;
this.player2=player2;
this.player11=player11;
this.player22=player22;
}
public void run(){
try{
DataInputStream fromPlayer1=new DataInputStream(player1.getInputStream());
DataOutputStream toPlayer1=new DataOutputStream(player11.getOutputStream());
DataInputStream fromPlayer2=new DataInputStream(player2.getInputStream());
DataOutputStream toPlayer2=new DataOutputStream(player22.getOutputStream());
String t="gg";
toPlayer1.writeChars(t);
while(true){
String message2=fromPlayer1.readUTF();;
toPlayer2.writeChars(message2);
String message3=fromPlayer2.readUTF();;
toPlayer1.writeChars(message3);
}
}catch(IOException ex){System.err.println(ex);}

}

}
}
Java多线程通信socket聊天工具