前几天学了java的线程、I/O、今天又学了socket,加上之前学的GUI,简单的做了一下实现聊天的界面,服务器和客户端都可以接受,发送信息。
服务器端的代码:
SocketThreadServer.java:
package com.lansing.chat;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class SocketThreadServer {
public static void main(String[] args){
new SocketThreadServer();
ServerThreadListener
MyServer=new ServerThreadListener(8888,10);//定义端口和连接数
}
}
class ServerThreadListener extends JFrame{
ServerSocket lst;//监听
Socket connection;//socket对象
JTextArea display;//监听窗口
int counter=1;//连接数
public ServerThreadListener(int port,int
join){
super("Server Listening
window");
Container
c=getContentPane();
display=new
JTextArea("Listening service window");
c.add(new
JScrollPane(display),BorderLayout.CENTER);
setSize(300,180);
setVisible(true);
try {
lst=new
ServerSocket(port,join);//创建监听器
display.setText("waiting
for connection");
while(true){
connection=lst.accept();//接受来自客户端的请求
//显示客户端的地址和标识
display.append("\nConnection
"+counter+" received
from:"+connection.getInetAddress().getHostName());
//创建线程对象
ServerThread
thread=new ServerThread(this,connection,counter);
thread.connectThread.start();
++counter;
}
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
}
//线程窗口实现Runnable,当客户端发送数据时创建这样一个线程窗口与之交互
class ServerThread extends JFrame implements Runnable{
ServerThreadListener
serverListener;//当前线程监听
Socket connectClient;//socket对象
Thread connectThread;//线程对象
private JLabel jlabel;
private JTextArea display;
private JButton submitButton;
private JTextField enter;
private JTextField username;
private String[]
str={"知道了!","什么事?","你在哪儿?","我等你","生日快乐","祝你万事如意!","希望你学习进步"};
private JComboBox combo;
ObjectOutputStream output;//输出流
ObjectInputStream input;//输入流
int count;
//ServerThread构造方法
public ServerThread(ServerThreadListener
ls,Socket socket,int s){
super("Server Thread");
serverListener=ls;
connectClient=socket;
count=s;
connectThread=new
Thread(this);//创建当前线程对象
this.setLayout(new
BorderLayout());
JPanel titlePanel=new
JPanel();
titlePanel.setLayout(new
GridLayout(1,3));
titlePanel.add(new
JLabel()); jlabel=new
JLabel("聊 天 室");
titlePanel.add(jlabel);
titlePanel.add(new
JLabel());
this.add(titlePanel,BorderLayout.NORTH);
JPanel toppanel=new
JPanel();
toppanel.setLayout(new
FlowLayout());
display=new JTextArea();
display.setRows(30);
display.setColumns(25);
toppanel.add(display);
this.add(toppanel,BorderLayout.CENTER);
JPanel downPanel=new
JPanel();
downPanel.setLayout(new
FlowLayout());
username=new
JTextField(10);
username.setText("");
downPanel.add(username);
enter=new JTextField(20);
// submitButton=new
JButton("发送");
downPanel.add(enter);
enter.setEnabled(true);
enter.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent e) {
//
TODO Auto-generated method stub
sendData(username.getText()+":
"+e.getActionCommand());
display.setText(username.getText()+":
"+enter.getText());
enter.setText("");
}
});
combo=new JComboBox(str);
combo.setToolTipText("常用语");
combo.setMaximumRowCount(3);//设置
JComboBox 显示的最大行数
combo.addItemListener(new
ItemListener() {
@Override
public void
itemStateChanged(ItemEvent e) {
//
TODO Auto-generated method stub
enter.setText(str[combo.getSelectedIndex()]);//返回列表中与给定项匹配的第一个选项
combo.setFocusable(false);
}
});
downPanel.add(combo);
this.add(downPanel,BorderLayout.SOUTH);
this.setSize(500,500);
this.setVisible(true);
display.append("\nConnection
received
from:"+connectClient.getInetAddress().getHostName());
}
//实现Runnable接口方法
@Override
public void run() {
// TODO Auto-generated method
stub
System.out.println("Thread
start");
try {
output=new
ObjectOutputStream(connectClient.getOutputStream());//输出流
input=new
ObjectInputStream(connectClient.getInputStream());
String
message="Connection successful";
output.writeObject(message);//向客户端发送信息
output.flush();
enter.setEnabled(true);
do{
try {
message=(String)
input.readObject();//读取客户端的信息
display.append("\n"+message);//显示在窗口的文本域中
display.setCaretPosition(display.getText().length());
} catch
(ClassNotFoundException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
display.append("\nUnknown
object type received");
}
}
while(!message.equals("END"));//"end"结束循环
display.append("\nUser
terminated connection");
enter.setEnabled(false);
output.close();
input.close();
connectClient.close();
dispose();
}
catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
System.out.println("Client
terminated connection"); }
}
private void sendData(String s){
try {
output.writeObject(s);//发送数据
output.flush();
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
display.append("\nError
writing object");
}
}
}
客户端代码:
Client.java:
package com.lansing.chat;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client extends JFrame{
private JLabel jlabel;
private JTextArea display;
private JButton submitButton;
private JTextField enter;
private JTextField username;
String message="";
private String[]
str={"知道了!","什么事?","你在哪儿?","我等你","生日快乐","祝你万事如意!","希望你学习进步"};
private JComboBox combo;
ObjectOutputStream output;//输出流
ObjectInputStream input;//输入流
public Client(){
super("Client");
this.setLayout(new
BorderLayout());
JPanel titlePanel=new
JPanel();
titlePanel.setLayout(new
GridLayout(1,3));
titlePanel.add(new
JLabel()); jlabel=new
JLabel("聊 天 室");
titlePanel.add(jlabel);
titlePanel.add(new
JLabel());
this.add(titlePanel,BorderLayout.NORTH);
JPanel toppanel=new
JPanel();
toppanel.setLayout(new
FlowLayout());
display=new JTextArea();
display.setRows(30);
display.setColumns(25);
toppanel.add(display);
this.add(toppanel,BorderLayout.CENTER);
JPanel downPanel=new
JPanel();
downPanel.setLayout(new
FlowLayout());
username=new
JTextField(10);
username.setText("");
downPanel.add(username);
enter=new JTextField(20);
downPanel.add(enter);
enter.setEnabled(true);
enter.addActionListener(new
ActionListener() {
@Override
public void
actionPerformed(ActionEvent e) {
//
TODO Auto-generated method stub
sendData(username.getText()+":
"+e.getActionCommand());//返回与此动作相关的命令字符串
display.setText(username.getText()+":
"+enter.getText());
enter.setText("");
}
});
combo=new JComboBox(str);
combo.setToolTipText("常用语");
combo.setMaximumRowCount(3);//设置
JComboBox 显示的最大行数
combo.addItemListener(new
ItemListener() {
@Override
public void
itemStateChanged(ItemEvent e) {
//
TODO Auto-generated method stub
enter.setText(str[combo.getSelectedIndex()]);//返回列表中与给定项匹配的第一个选项
combo.setFocusable(false);
}
});
downPanel.add(combo);
this.add(downPanel,BorderLayout.SOUTH);
this.setSize(500,500);
this.setVisible(true);
}
//建立与服务器端的数据传递
public void runClient(){
Socket client;
display.setText("Attempting
connection\n");
//建立与服务器5000端口的连接
try {
client=new
Socket(InetAddress.getByName("127.0.0.1"),8888);
display.append("connected
to:"+client.getInetAddress().getHostName());
output=new
ObjectOutputStream(client.getOutputStream());//输入流
input=new
ObjectInputStream(client.getInputStream());//输出流
enter.setEnabled(true);
do{
try {
message=(String)
input.readObject();//读取信息
display.append("\n"+message);//显示到文本域中
display.setCaretPosition(display.getText().length());
} catch
(ClassNotFoundException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
while(!(message.equals("END")));
display.append("Closing
connection.\n");
output.close();
input.close();
client.close();
}
catch (UnknownHostException e)
{
// TODO
Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
private void sendData(String s){
message=s;
try {
output.writeObject(s);
output.flush();//发送数据
} catch (IOException e) {
// TODO
Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws
UnknownHostException, IOException {
// TODO Auto-generated method
stub
// Socket socket=new
Socket("127.0.0.1",8888);
Client app=new Client();
app.addWindowListener(new
WindowAdapter() {
public void
windowClosing(WindowEvent e){
System.exit(0);
}
});
app.runClient();
}
}