• Java socket长连接代码实现


    服务器端程序:

    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    public class ChatServer {
    	boolean started = false;
    	ServerSocket ss = null;
    	List<Client> clients = new ArrayList<Client>();
    
    	public static void main(String[] args) {
    		new ChatServer().start();
    	}
    
    	public void start() {
    		try {
    			ss = new ServerSocket(8888);
    			started = true;
    			System.out.println("端口已开启,占用8888端口号....");
    		} catch (BindException e) {
    			System.out.println("端口使用中....");
    			System.out.println("请关掉相关程序并重新运行服务器!");
    			System.exit(0);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		try {
    			while (started) {
    				Socket s = ss.accept();
    				Client c = new Client(s);
    				System.out.println("a client connected!");
    				new Thread(c).start();
    				clients.add(c);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				ss.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	class Client implements Runnable {
    		private Socket s;
    		private DataInputStream dis = null;
    		private DataOutputStream dos = null;
    		private boolean bConnected = false;
    
    		public Client(Socket s) {
    			this.s = s;
    			try {
    				dis = new DataInputStream(s.getInputStream());
    				dos = new DataOutputStream(s.getOutputStream());
    				bConnected = true;
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    
    		public void send(String str) {
    			try {
    				dos.writeUTF(str);
    			} catch (IOException e) {
    				clients.remove(this);
    				System.out.println("对方退出了!我从List里面去掉了!");
    			}
    		}
    
    		public void run() {
    			try {
    				while (bConnected) {
    					String str = dis.readUTF();
    					System.out.println("------------来自本地服务器:" + str);
    					for (int i = 0; i < clients.size(); i++) {
    						Client c = clients.get(i);
    						c.send(str);
    					}
    				}
    			} catch (EOFException e) {
    				System.out.println("Client closed!");
    			} catch (IOException e) {
    				e.printStackTrace();
    			} finally {
    				try {
    					if (dis != null)
    						dis.close();
    					if (dos != null)
    						dos.close();
    					if (s != null) {
    						s.close();
    					}
    
    				} catch (IOException e1) {
    					e1.printStackTrace();
    				}
    
    			}
    		}
    	}
    }

    客户端程序:

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    
    /**
     * @author Michael Huang
     * 
     */
    public class ChatClient extends Frame {
    	Socket s = null;
    	DataOutputStream dos = null;
    	DataInputStream dis = null;
    	private boolean bConnected = false;
    
    	TextField tfTxt = new TextField();
    	TextArea taContent = new TextArea();
    
    	Thread tRecv = new Thread(new RecvThread());
    
    	public static void main(String[] args) {
    		new ChatClient().launchFrame(8888);
    	}
    
    	public void launchFrame(int port) {
    		setLocation(400, 300);
    		this.setSize(300, 300);
    		add(tfTxt, BorderLayout.SOUTH);
    		add(taContent, BorderLayout.NORTH);
    		pack();
    		this.addWindowListener(new WindowAdapter() {
    
    			@Override
    			public void windowClosing(WindowEvent arg0) {
    				disconnect();
    				System.exit(0);
    			}
    
    		});
    		tfTxt.addActionListener(new TFListener());
    		setVisible(true);
    		connect(port);
    
    		tRecv.start();
    	}
    
    	public void connect(int port) {
    		try {
    			s = new Socket("127.0.0.1", port);
    			dos = new DataOutputStream(s.getOutputStream());
    			dis = new DataInputStream(s.getInputStream());
    			System.out.println("~~~~~~~~连接成功~~~~~~~~!");
    			bConnected = true;
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	public void disconnect() {
    		try {
    			dos.close();
    			dis.close();
    			s.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	private class TFListener implements ActionListener {
    
    		public void actionPerformed(ActionEvent e) {
    			String str = tfTxt.getText().trim();
    			tfTxt.setText("");
    
    			try {
    				dos.writeUTF(str);
    				dos.flush();
    			} catch (IOException e1) {
    				e1.printStackTrace();
    			}
    
    		}
    
    	}
    
    	private class RecvThread implements Runnable {
    
    		public void run() {
    			try {
    				while (bConnected) {
    					String str = dis.readUTF();
    					taContent.setText(taContent.getText() + str + '
    ');
    				}
    			} catch (SocketException e) {
    				System.out.println("退出了,bye!");
    			} catch (EOFException e) {
    				System.out.println("退出了,bye!");
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    		}
    
    	}
    }
  • 相关阅读:
    String
    Array常用方法
    Array类
    ruby调试/练习时的小技巧
    集合类对象的遍历处理办法
    Tech road one step 7-Noc to 13-Nov
    Tech road one step 31-Oct 6-Nov
    TechRoad_oneStep_17-23 10
    TechRoad_oneStep_1001
    TechRoad_oneStep_0919
  • 原文地址:https://www.cnblogs.com/yhtboke/p/6230145.html
Copyright © 2020-2023  润新知