Java: 写个简单的Client,Server聊天程序

时间:2022-09-05 13:16:04
初学Socket。
写个简单的Client,Server聊天程序,从一个更简单的程序修改过来的,Enjoying。
东西不大,但是基础的东西涉及到了一些。
客户端能够连接上,断开,再连接。(被我修改的那个不能断开,也就不能重连了)
缺陷:在服务器上保存了所有的链接,更进一步改进应该处理好客户端连接的缓存和断开的关系。

Server 存储的信息
Java: 写个简单的Client,Server聊天程序package practice;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序
import java.net.*;
Java: 写个简单的Client,Server聊天程序
import java.io.*;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序
public class ClientInfo {
Java: 写个简单的Client,Server聊天程序    
private Socket socket;
Java: 写个简单的Client,Server聊天程序    
private PrintWriter writer;
Java: 写个简单的Client,Server聊天程序    
private BufferedReader reader;
Java: 写个简单的Client,Server聊天程序    
private String clientIp;
Java: 写个简单的Client,Server聊天程序    
private int clientPort;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public String getClientIp() {
Java: 写个简单的Client,Server聊天程序        
return clientIp;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void setClientIp(String clientIp) {
Java: 写个简单的Client,Server聊天程序        
this.clientIp = clientIp;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public int getClientPort() {
Java: 写个简单的Client,Server聊天程序        
return clientPort;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void setClientPort(int clientPort) {
Java: 写个简单的Client,Server聊天程序        
this.clientPort = clientPort;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public Socket getSocket() {
Java: 写个简单的Client,Server聊天程序        
return socket;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void setSocket(Socket socket) {
Java: 写个简单的Client,Server聊天程序        
this.socket = socket;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public PrintWriter getWriter() {
Java: 写个简单的Client,Server聊天程序        
return writer;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void setWriter(PrintWriter writer) {
Java: 写个简单的Client,Server聊天程序        
this.writer = writer;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public BufferedReader getReader() {
Java: 写个简单的Client,Server聊天程序        
return reader;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void setReader(BufferedReader reader) {
Java: 写个简单的Client,Server聊天程序        
this.reader = reader;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void closeSocket(){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            reader.close();
Java: 写个简单的Client,Server聊天程序            writer.close();
Java: 写个简单的Client,Server聊天程序            socket.close();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序}

Java: 写个简单的Client,Server聊天程序

Server
Java: 写个简单的Client,Server聊天程序package practice;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序
import java.net.*;
Java: 写个简单的Client,Server聊天程序
import java.io.*;
Java: 写个简单的Client,Server聊天程序
import java.util.*;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序
public class VerySimpleChatServer {
Java: 写个简单的Client,Server聊天程序    ArrayList
<ClientInfo> clientInfoList;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public static void main(String[] args){
Java: 写个简单的Client,Server聊天程序        (
new VerySimpleChatServer()).go();
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void go(){
Java: 写个简单的Client,Server聊天程序        clientInfoList 
= new ArrayList<ClientInfo>();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            ServerSocket serverSocket 
= new ServerSocket(5000);
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            
while(true){
Java: 写个简单的Client,Server聊天程序                Socket newSocket 
= serverSocket.accept();
Java: 写个简单的Client,Server聊天程序                ClientInfo client 
= new ClientInfo();
Java: 写个简单的Client,Server聊天程序                client.setClientIp(newSocket.getInetAddress().getHostAddress());
Java: 写个简单的Client,Server聊天程序                client.setClientPort(newSocket.getPort());
Java: 写个简单的Client,Server聊天程序                client.setSocket(newSocket);
Java: 写个简单的Client,Server聊天程序                client.setWriter(
new PrintWriter(newSocket.getOutputStream()));
Java: 写个简单的Client,Server聊天程序                client.setReader(
new BufferedReader(new InputStreamReader(newSocket.getInputStream())));
Java: 写个简单的Client,Server聊天程序                clientInfoList.add(client);
Java: 写个简单的Client,Server聊天程序                
Java: 写个简单的Client,Server聊天程序                Thread t 
= new Thread(new ThreadRunner(client));
Java: 写个简单的Client,Server聊天程序                t.start();
Java: 写个简单的Client,Server聊天程序                
Java: 写个简单的Client,Server聊天程序                System.out.println(
"got a new connection!");
Java: 写个简单的Client,Server聊天程序            }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
class ThreadRunner implements Runnable{
Java: 写个简单的Client,Server聊天程序        ClientInfo clientInfo;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
public ThreadRunner(ClientInfo clientInfo){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            
try{
Java: 写个简单的Client,Server聊天程序                
this.clientInfo = clientInfo;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序                e.printStackTrace();
Java: 写个简单的Client,Server聊天程序            }

Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
public void run(){
Java: 写个简单的Client,Server聊天程序            String message 
= null;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            
try{
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序                
while((message = clientInfo.getReader().readLine()) != null){
Java: 写个简单的Client,Server聊天程序                    System.out.println(
"received message: " + message);
Java: 写个简单的Client,Server聊天程序                    tellEveryBody(message);
Java: 写个简单的Client,Server聊天程序                }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序                
//e.printStackTrace();
Java: 写个简单的Client,Server聊天程序
                synchronized(this){
                     clientInfo.closeSocket();
                     clientInfoList.remove(clientInfo);
                   }
Java: 写个简单的Client,Server聊天程序            }

Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void tellEveryBody(String message){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
for(ClientInfo client: clientInfoList){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            
try{
Java: 写个简单的Client,Server聊天程序                PrintWriter writer 
= client.getWriter();
Java: 写个简单的Client,Server聊天程序                System.out.println(
"tell "+ client.getClientIp()+":" + client.getClientPort() +" about: " + message);
Java: 写个简单的Client,Server聊天程序                writer.println(message);
Java: 写个简单的Client,Server聊天程序                writer.flush();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序                e.printStackTrace();
Java: 写个简单的Client,Server聊天程序            }

Java: 写个简单的Client,Server聊天程序        }
// end for
Java: 写个简单的Client,Server聊天程序
    }
// end tellEveryBody
Java: 写个简单的Client,Server聊天程序
}

Java: 写个简单的Client,Server聊天程序

Client
Java: 写个简单的Client,Server聊天程序package practice;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序
import java.awt.event.ActionEvent;
Java: 写个简单的Client,Server聊天程序
import java.awt.event.ActionListener;
Java: 写个简单的Client,Server聊天程序
import java.io.BufferedReader;
Java: 写个简单的Client,Server聊天程序
import java.io.InputStreamReader;
Java: 写个简单的Client,Server聊天程序
import java.io.PrintWriter;
Java: 写个简单的Client,Server聊天程序
import java.net.Socket;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序
import javax.swing.JButton;
Java: 写个简单的Client,Server聊天程序
import javax.swing.JFrame;
Java: 写个简单的Client,Server聊天程序
import javax.swing.JPanel;
Java: 写个简单的Client,Server聊天程序
import javax.swing.JScrollPane;
Java: 写个简单的Client,Server聊天程序
import javax.swing.JTextArea;
Java: 写个简单的Client,Server聊天程序
import javax.swing.JTextField;
Java: 写个简单的Client,Server聊天程序
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序
public class SimpleChatClient {
Java: 写个简单的Client,Server聊天程序    JTextField outgoing;
Java: 写个简单的Client,Server聊天程序    JTextArea incoming;
Java: 写个简单的Client,Server聊天程序    PrintWriter writer;
Java: 写个简单的Client,Server聊天程序    BufferedReader reader;
Java: 写个简单的Client,Server聊天程序    Socket socket;
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
/**
Java: 写个简单的Client,Server聊天程序     * 
@param args
Java: 写个简单的Client,Server聊天程序     
*/

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public static void main(String[] args) {
Java: 写个简单的Client,Server聊天程序        (
new SimpleChatClient()).go();
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void go(){
Java: 写个简单的Client,Server聊天程序        buildGUI();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
if(initSocket()){
Java: 写个简单的Client,Server聊天程序            initWriter();
Java: 写个简单的Client,Server聊天程序            initReader();
Java: 写个简单的Client,Server聊天程序            startReadThread();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void buildGUI(){
Java: 写个简单的Client,Server聊天程序        JFrame frame 
= new JFrame("Simple Chat Client!");
Java: 写个简单的Client,Server聊天程序        JPanel panel 
= new JPanel();
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        outgoing 
= new JTextField(20);
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        incoming 
= new JTextArea(15,30);
Java: 写个简单的Client,Server聊天程序        incoming.setLineWrap(
true);
Java: 写个简单的Client,Server聊天程序        incoming.setWrapStyleWord(
true);
Java: 写个简单的Client,Server聊天程序        incoming.setEditable(
false);
Java: 写个简单的Client,Server聊天程序        JScrollPane inScroller 
= new JScrollPane(incoming);
Java: 写个简单的Client,Server聊天程序        inScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
Java: 写个简单的Client,Server聊天程序        inScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        JButton send 
= new JButton("Send");
Java: 写个简单的Client,Server聊天程序        send.addActionListener(
new SendActionListener());
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        panel.add(inScroller);
Java: 写个简单的Client,Server聊天程序        panel.add(outgoing);
Java: 写个简单的Client,Server聊天程序        panel.add(send);
Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序        frame.getContentPane().add(panel);
Java: 写个简单的Client,Server聊天程序        frame.setSize(
400,360);
Java: 写个简单的Client,Server聊天程序        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Java: 写个简单的Client,Server聊天程序        frame.setVisible(
true);
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private boolean initSocket(){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            socket 
= new Socket("127.0.0.1",5000);
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序            
return false;
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序        
return true;
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void initWriter(){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            writer 
= new PrintWriter(socket.getOutputStream());
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void initReader(){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            reader 
= new BufferedReader(new InputStreamReader(socket.getInputStream()));
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void startReadThread(){
Java: 写个简单的Client,Server聊天程序        Thread t 
= new Thread(new ReadRunner());
Java: 写个简单的Client,Server聊天程序        t.start();
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
private void sendMessage(String message){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            writer.println(message);
Java: 写个简单的Client,Server聊天程序            writer.flush();
Java: 写个简单的Client,Server聊天程序            outgoing.setText(
"");
Java: 写个简单的Client,Server聊天程序            outgoing.requestFocus();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序        
Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
class SendActionListener implements ActionListener{
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
public void actionPerformed(ActionEvent event){
Java: 写个简单的Client,Server聊天程序            sendMessage(outgoing.getText());
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
class ReadRunner implements Runnable{
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
public void run(){
Java: 写个简单的Client,Server聊天程序            String line 
= "";
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            
try{
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序                
while((line = reader.readLine())!=null){
Java: 写个简单的Client,Server聊天程序                    System.out.println(
"Receive from server: " + line);
Java: 写个简单的Client,Server聊天程序                    incoming.append(
"Receive from server: " + line + " ");
Java: 写个简单的Client,Server聊天程序                }

Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序            }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序                e.printStackTrace();
Java: 写个简单的Client,Server聊天程序            }

Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序    
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序    
public void finalize(){
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        
try{
Java: 写个简单的Client,Server聊天程序            reader.close();
Java: 写个简单的Client,Server聊天程序            writer.close();
Java: 写个简单的Client,Server聊天程序            socket.close();
Java: 写个简单的Client,Server聊天程序Java: 写个简单的Client,Server聊天程序        }
catch(Exception e){
Java: 写个简单的Client,Server聊天程序            e.printStackTrace();
Java: 写个简单的Client,Server聊天程序        }

Java: 写个简单的Client,Server聊天程序    }

Java: 写个简单的Client,Server聊天程序}

Java: 写个简单的Client,Server聊天程序