这是一个简单的socket测试实例, 应用Javaswing、线程。
客户端类
package com.xyb.fhy.socketthreadtest;
import java.awt.Container;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 多线程客户端socket连接
*
* @gsm FHY
* @date 2014-5-19
* @time 下午03:00:56
* @author XieYB
* @version 1.0.0 XieYB
*/
public class Client extends JFrame implements Runnable {
private static final long serialVersionUID = 342677620286532450L;
// 桌面应用文本区域
JTextArea jta = new JTextArea();
// 桌面应用文本框
JTextField jtxt = new JTextField();
// socket对象
Socket socket = null;
// 缓存字符流
BufferedReader bu = null;
BufferedWriter bw = null;
public Client() {
// 创建桌面应用的容器
Container con = this.getContentPane();
// 设置容器布局
con.setLayout(null);
// 设置桌面滚动条
JScrollPane jsp = new JScrollPane(jta);
// 设置大小
jsp.setBounds(10, 10, 400, 400);
// 将文本信息加入到容器
con.add(jsp);
// 设置文本框位置
jtxt.setBounds(30, 420, 100, 20);
// 将文本框加入到容器
con.add(jtxt);
// 设置点击按钮
JButton jb = new JButton("发送信息");
// 设置按钮位置
jb.setBounds(140, 420, 100, 20);
// 将按钮添加到容器
con.add(jb);
// 添加按钮事件
jb.addActionListener(new ClientSendMessage(this));
// 设置容器大小
this.setSize(500, 500);
// 设置容器名称
this.setTitle("客户端");
// 设置默认关闭操作
this.setDefaultCloseOperation(3);
// 设置是否显示该容器
this.setVisible(true);
openClient();
}
// 客户端socket方法
private void openClient() {
try {
// 获取服务器端IP地址,端口号
this.socket = new Socket("127.0.0.1", 8888);
// 读取服务器传过的信息流
this.bu = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 向服务器端发送信息流
this.bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
} catch (IOException e) {
System.out.println("客户端socket处理信息错误!");
}
//调用线程
Thread thread = new Thread(this);
//启动一个线程
thread.start();
}
// 线程入口点
public void run() {
//无限循环,不关闭客户端信息
while (true) {
try {
//读取服务器发送信息
String info = bu.readLine();
//将信息加入到桌面应用文本域中
this.jta.append("服务器说:" + info + "\n");
} catch (IOException e) {
System.out.println("读取服务器端信息出错!");
}
}
}
//主程序入口点
public static void main(String[] args) {
new Client();
}
}
swing 客户端事件类
package com.xyb.fhy.socketthreadtest;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
/**
* 添加桌面应用事件
*
* @gsm FHY
* @date 2014-5-19
* @time 下午03:34:25
* @author XieYB
* @version 1.0.0 XieYB
*/
public class ClientSendMessage implements ActionListener {
// 获取client桌面
Client jframe;
//带参数构造方法
public ClientSendMessage(Client jframe) {
//对象复制
this.jframe = jframe;
}
//action执行完成事件
public void actionPerformed(ActionEvent arg0) {
//获取client容器中文本框的值
String message = jframe.jtxt.getText();
//将文本框中的值加入到文本域中
jframe.jta.append("客户端说:" + message + "\n");
//将文本框的值设置为空
jframe.jtxt.setText("");
try {
//将信息加入到输出流中
jframe.bw.append(message);
//设置换行信息
jframe.bw.newLine();
//刷新流,让服务及时显示信息
jframe.bw.flush();
} catch (IOException e) {
System.out.println("ClientSendMessage加入流出错");
}
}
}
服务器端类
package com.xyb.fhy.socketthreadtest;
import java.awt.Container;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* 多线程服务器端Socket连接
*
* @gsm FHY
* @date 2014-5-19
* @time 下午03:44:59
* @author XieYB
* @version 1.0.0XieYB
*/
public class Server extends JFrame implements Runnable{
private static final long serialVersionUID = 3235601621525888716L;
// 桌面应用文本区域
JTextArea jta = new JTextArea();
// 桌面应用文本框
JTextField jtxt = new JTextField();
//服务器端socket对象
ServerSocket server;
// socket对象
Socket socket = null;
// 缓存字符流
BufferedReader bu = null;
BufferedWriter bw = null;
public Server() {
// 创建桌面应用的容器
Container con = this.getContentPane();
// 设置容器布局
con.setLayout(null);
// 设置桌面滚动条
JScrollPane jsp = new JScrollPane(jta);
// 设置大小
jsp.setBounds(10, 10, 400, 400);
// 将文本信息加入到容器
con.add(jsp);
// 设置文本框位置
jtxt.setBounds(30, 420, 100, 20);
// 将文本框加入到容器
con.add(jtxt);
// 设置点击按钮
JButton jb = new JButton("发送信息");
// 设置按钮位置
jb.setBounds(140, 420, 100, 20);
// 将按钮添加到容器
con.add(jb);
// 添加按钮事件
jb.addActionListener(new SeverSendMessage(this));
// 设置容器大小
this.setSize(500, 500);
// 设置容器名称
this.setTitle("服务器端");
// 设置默认关闭操作
this.setDefaultCloseOperation(3);
// 设置是否显示该容器
this.setVisible(true);
openClient();
}
// 客户端socket方法
private void openClient() {
try {
// 设置端口号
server = new ServerSocket(8888);
//socket监听
socket = server.accept();
// 读取客户端传过的信息流
this.bu = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 向客户端发送信息流
this.bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
} catch (IOException e) {
System.out.println("服务器端socket处理信息错误!");
}
//调用线程
Thread thread = new Thread(this);
//启动一个线程
thread.start();
}
// 线程入口点
public void run() {
//无限循环,不关闭服务器端信息
while (true) {
try {
//读取客户端发送信息
String info = bu.readLine();
//将信息加入到桌面应用文本域中
this.jta.append("客户端说:" + info + "\n");
} catch (IOException e) {
System.out.println("读取客户端信息出错!");
}
}
}
//主程序入口点
public static void main(String[] args) {
new Server();
}
}
swing 服务器端事件类
package com.xyb.fhy.socketthreadtest;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
/**
* 服务器端桌面监听事件
*
* @gsm FHY
* @date 2014-5-19
* @time 下午03:54:14
* @author XieYB
* @version 1.0.0XieYB
*/
public class SeverSendMessage implements ActionListener {
// 获取Server桌面
Server jframe;
//带参数构造方法
public SeverSendMessage(Server jframe) {
//对象复制
this.jframe = jframe;
}
//action执行完成事件
public void actionPerformed(ActionEvent arg0) {
//获取Server容器中文本框的值
String message = jframe.jtxt.getText();
//将文本框中的值加入到文本域中
jframe.jta.append("服务器说:" + message + "\n");
//将文本框的值设置为空
jframe.jtxt.setText("");
try {
//将信息加入到输出流中
jframe.bw.append(message);
//设置换行信息
jframe.bw.newLine();
//刷新流,让客户端及时显示信息
jframe.bw.flush();
} catch (IOException e) {
System.out.println("SeverSendMessage加入流出错");
}
}
}