Created
February 6, 2015 12:04
-
-
Save Tikitoo/5fce557e472f3b8d3873 to your computer and use it in GitHub Desktop.
A simple socket chat demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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