zoukankan      html  css  js  c++  java
  • 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();
    			}
    
    		}
    
    	}
    }
  • 相关阅读:
    JVM参数默认值列表
    垃圾回收G1日志解析
    《深入理解JAVA虚拟机》垃圾回收时为什么会停顿
    《深入理解JAVA虚拟机》JDK的垃圾收集算法
    什么才是技术?
    Lodash使用示例(比较全)
    MSCL超级工具类(C#),开发人员必备,开发利器
    刷新SqlServer数据库中所有的视图
    Sql Server 2014/2012/2008/2005 数据库还原出现 3154错误的解决办法
    C#中执行批处理文件(.bat),执行数据库相关操作
  • 原文地址:https://www.cnblogs.com/yhtboke/p/6230145.html
Copyright © 2011-2022 走看看