java socket多人聊天_JavaAWT简单Socket多人聊天程序(简单明了)

//-------------------------------------------Server-----------------------------------------------:

public class ChatServer {

//所有客户端对象List

List clients = new ArrayList();

//所有客户端对象Iterator

Iterator it;

public static void main(String[] args) {

new ChatServer().start();

}

public void start() {

boolean started = false;

ServerSocket ss = null;

try {

ss = new ServerSocket(5555);//端口号5555

started = true;

System.out.println("服务端已启动!");

} catch (SocketException e) {

System.out.println("端口正在被使用,请关闭相应程序!");

System.exit(0);

} catch (IOException e) {

e.printStackTrace();

}

try {

while (started) {

Socket s = ss.accept();

//有客户端连了

Client c = new Client(s);

clients.add(c);

System.out.println("a client connected!");

new Thread(c).start();

}

} catch (Exception e) {

e.printStackTrace();

}finally {

try {

ss.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 每个请求过来启用一个线程来处理

*/

private class Client implements Runnable {

DataInputStream dis = null;

DataOutputStream dos = null;

boolean connected = false;

Client(Socket s) {

try {

dis = new DataInputStream(s.getInputStream());

dos = new DataOutputStream(s.getOutputStream());

connected = true;

}catch(EOFException e){

e.printStackTrace();

}catch (IOException e) {

e.printStackTrace();

}

}

public void run() {

while (connected) {

try {

//System.out.println("---------------------"+clients.size()+"---------------------");

it= clients.iterator();

//把客户端发的信息读进来

String msg = dis.readUTF();

//把信息写出去发给每个客户端

while (it.hasNext()) {

Client c = it.next();

try {

c.send(msg);

} catch (SocketException e) {

//从服务端发送信息失败,此client可能已关闭,所以要把它从Iterator里remove(不要用clients.remove会报ConcurrentModificationException)

it.remove();

}

}

} catch (EOFException eof) {

connected = false;

System.out.println("服务端EOFException:客户端已关闭");

}catch(SocketException e){

connected = false;

System.out.println("服务端读取信息失败:SocketException");

}catch (IOException e) {

System.out.println("服务端读取信息失败:IOException");

}

}

}

private void send(String str) throws IOException {

dos.writeUTF(str);

}

}

}

//-------------------------------------------Client-----------------------------------------------:

public class ChatClient extends Frame { private static final long serialVersionUID = 5798410085795768914L; public TextField tf = new TextField(); public TextArea ta = new TextArea(); DataOutputStream dos = null; DataInputStream dis = null; public Socket socket = null; boolean connected = false; Thread receiver = new Thread(new ReceiverThread()); public static void main(String[] args) { new ChatClient().launchFrame(); } public void launchFrame() { this.setLocation(250, 100); this.setSize(500, 600); this.add(tf, BorderLayout.SOUTH); this.add(ta, BorderLayout.NORTH); this.pack(); this.addWindowListener(new WindowMonitor()); tf.addKeyListener(new KeyMonitor()); connect(); receiver.start(); this.setVisible(true); } public void connect() { try { socket = new Socket("127.0.0.1", 5555);//port5555 dos = new DataOutputStream(socket.getOutputStream()); dis = new DataInputStream(socket.getInputStream()); connected = true; } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void disconnect() { try { dis.close(); dos.close(); socket.close(); }catch(EOFException e){ System.out.println("这是合法的,客户端已经关闭"); }catch (IOException e) { e.printStackTrace(); } } public void closeWindow(){ dispose(); } private class WindowMonitor extends WindowAdapter { @Override public void windowClosing(WindowEvent e) { disconnect(); //System.exit(0); closeWindow(); } } private class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (KeyEvent.VK_ENTER == keyCode) { try { dos.writeUTF(tf.getText().trim()); dos.flush(); } catch (IOException ioe) { System.out.println("客户端发送信息失败:"+"\n"); ioe.printStackTrace(); } tf.setText(""); } } } private class ReceiverThread implements Runnable { public void run() { try { while (connected) { String str = dis.readUTF(); ta.setText(ta.getText() + str + '\n'); } } catch (SocketException e) { System.out.println("客户端断开连接!SokectException"); connected = false; } catch (EOFException e) { System.out.println("客户端断开连接!EOFException"); connected = false; } catch (IOException e) { e.printStackTrace(); } } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Socket编程可以用于实现多人聊天室。以下是一个简单Java多人聊天室的代码示例: Server端代码: ```java import java.io.*; import java.net.*; import java.util.*; public class Server { ArrayList<PrintWriter> clientOutputStreams; public class ClientHandler implements Runnable { BufferedReader reader; Socket socket; public ClientHandler(Socket clientSocket) { try { socket = clientSocket; InputStreamReader isReader = new InputStreamReader(socket.getInputStream()); reader = new BufferedReader(isReader); } catch (Exception ex) { ex.printStackTrace(); } } public void run() { String message; try { while ((message = reader.readLine()) != null) { System.out.println("read " + message); tellEveryone(message); } } catch (Exception ex) { ex.printStackTrace(); } } } public static void main (String[] args) { new Server().go(); } public void go() { clientOutputStreams = new ArrayList<PrintWriter>(); try { ServerSocket serverSock = new ServerSocket(5000); while(true) { Socket clientSocket = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); clientOutputStreams.add(writer); Thread t = new Thread(new ClientHandler(clientSocket)); t.start(); System.out.println("got a connection"); } } catch (Exception ex) { ex.printStackTrace(); } } public void tellEveryone(String message) { Iterator<PrintWriter> it = clientOutputStreams.iterator(); while (it.hasNext()) { try { PrintWriter writer = (PrintWriter) it.next(); writer.println(message); writer.flush(); } catch (Exception ex) { ex.printStackTrace(); } } } } ``` Client端代码: ```java import java.io.*; import java.net.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Client { JTextArea incoming; JTextField outgoing; BufferedReader reader; PrintWriter writer; Socket sock; public static void main(String[] args) { new Client().go(); } public void go() { JFrame frame = new JFrame("Ludicrously Simple Chat Client"); JPanel mainPanel = new JPanel(); incoming = new JTextArea(15,50); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); JButton sendButton = new JButton("Send"); sendButton.addActionListener(new SendButtonListener()); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); setUpNetworking(); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setSize(400,500); frame.setVisible(true); } private void setUpNetworking() { try { sock = new Socket("127.0.0.1", 5000); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); System.out.println("networking established"); } catch (IOException ex) { ex.printStackTrace(); } } public class SendButtonListener implements ActionListener { public void actionPerformed(ActionEvent ev) { try { writer.println(outgoing.getText()); writer.flush(); } catch (Exception ex) { ex.printStackTrace(); } outgoing.setText(""); outgoing.requestFocus(); } } public class IncomingReader implements Runnable { public void run() { String message; try { while ((message = reader.readLine()) != null) { System.out.println("client read " + message); incoming.append(message + "\n"); } } catch (Exception ex) { ex.printStackTrace(); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值