Skip to content

Instantly share code, notes, and snippets.

@Tikitoo
Created February 6, 2015 12:04
Show Gist options
  • Save Tikitoo/5fce557e472f3b8d3873 to your computer and use it in GitHub Desktop.
Save Tikitoo/5fce557e472f3b8d3873 to your computer and use it in GitHub Desktop.
A simple socket chat demo
package socket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 实现一个多人聊天Demo
* ChatClient:客户端,可以发送消息
* ChatServer:服务端,接收消息并发送给所有用户
* Created by tikitoo on 2/6/15.
*/
public class ChatClient {
JTextArea inComing;
JTextField outGoing;
BufferedReader reader;
PrintWriter writer;
Socket socket;
public static void main(String[] args) {
new ChatClient().go();
}
/**
* 设置界面
*/
public void go() {
JFrame frame = new JFrame("Simple Chat Client");
JPanel mainPanel = new JPanel();
inComing = new JTextArea(15, 50);
inComing.setLineWrap(true);
inComing.setWrapStyleWord(true);
inComing.setEditable(false);
inComing.setBackground(Color.DARK_GRAY);
// 添加滚动
JScrollPane scrollPane = new JScrollPane(inComing);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
outGoing = new JTextField(20);
JButton sendBtn = new JButton("Send");
sendBtn.addActionListener(new SendButtonListener());
mainPanel.add(scrollPane);
mainPanel.add(outGoing);
mainPanel.add(sendBtn);
setUpNetworking();
// 多线程读取消息
Thread readerThread = new Thread(new InComingReader());
readerThread.start();
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(400, 500);
frame.setVisible(true);
}
/**
* Socket 连接
*/
private void setUpNetworking() {
try {
socket = new Socket("127.0.0.1", 8902);
InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(streamReader);
writer = new PrintWriter(socket.getOutputStream());
System.out.println("network connecting");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发送按钮监听
* 使用输出流发送数据给服务器
*/
public class SendButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
writer.println(outGoing.getText());
writer.flush();
outGoing.setText("");
outGoing.requestFocus();
}
}
/**
* 读取服务器发送过来的数据
*/
public class InComingReader implements Runnable {
@Override
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read: " + message);
// inComing.append(message + "\n");
inComing.setText(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 服务器端
* 接受数据,并将接收的数据转发给所有用户
* Created by tikitoo on 2/6/15.
*/
public class ChatServer {
/** 将读取的PrintWriter(不同客户端) 对象 */
ArrayList clientOutputStream;
public static void main(String[] args) {
new ChatServer().go();
}
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 (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read: " + message);
tellEveryOne(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
void go() {
clientOutputStream = new ArrayList();
try {
ServerSocket ss = new ServerSocket(8902);
while (true) {
Socket socket = ss.accept();
PrintWriter writer = new PrintWriter(socket.getOutputStream());
clientOutputStream.add(writer);
Thread t = new Thread(new ClientHandler(socket));
t.start();
System.out.println("go a connection");
}
} catch (IOException e) {
e.printStackTrace();
}
}
void tellEveryOne(String message) {
Iterator iter = clientOutputStream.iterator();
while (iter.hasNext()) {
PrintWriter writer = (PrintWriter) iter.next();
writer.println(message);
writer.flush();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment