`
谢永兵
  • 浏览: 14730 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java socket 简单实例(线程)

    博客分类:
  • J2SE
 
阅读更多

 

这是一个简单的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加入流出错");
		}
	}
	

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics