这是一个简单的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.0 XieYB */ 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.0 XieYB */ 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加入流出错"); } } }
相关推荐
Java Socket实例(服务器多线程) 自己写的代码
使用java socket开发的多线程文件上传下载的实例项目,多线程并发测试中可以支持200个,可能由于我电脑的配置问题,一般在并发大于200时client端可能会出现"阻塞"问题,还请大家指教
Java Socket多线程实例及文档,给大家分享这个期待你的加入。Java Socket多线程实例及文档
NULL 博文链接:https://lisanlai.iteye.com/blog/721084
java socket和多线程(Thread)实例 - JAVA SSH AJAX JS CSS - JavaEye技术网站
java socket 的长连接实例,服务器端支持多个客户端连接,服务器端支持客户端的掉线检测。多线程编程
Java tcp通讯,运用多线程,一个服务端与多个客户端进行交互
java socket网络编程,包括服务与客户端,多线程支持多客户端同时在线。
本项目为我现在负责开发的一个项目,在多线程并发测试中可以支持200个,可能由于我电脑的配置问题,一般在并发大于200时client端可能会出现"阻塞"问题,还请大家指教
主要介绍了Java Socket实现多线程通信功能,结合具体实例形式较为详细的分析了java多线程通信的原理及客户端、服务器端相应实现技巧,需要的朋友可以参考下
Java 实例 - Socket 实现多线程服务器程序源代码+详细指导教程.zip
主要介绍了Java Socket实现单线程通信的方法,结合具体实例形式分析了java socket单线程通信的原理与客户端、服务器端相关实现技巧,需要的朋友可以参考下
java socket 多线程文件上传下载的实例
Java Socket编写的聊天室,有用到多线程、Socket、输入输出流等相关知识。是个综合实例。局域网内多人聊天,类似qq群。
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
socket对象连接池实例,使用GenericObjectPool对象池。
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
java编程之线程与socket实例
而且,微软推出 C#主要的目的是为了对抗 Sun 公司的 Java。大家都 知道 Java 语言的强大功能,尤其在网络编程方面。于是, C#在网络编程方面也自然不甘落 后于人。本文就向大家介绍一下 C#下实现套接字( Sockets)...