`
yidwo
  • 浏览: 260578 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java socket和多线程(Thread)实例

    博客分类:
  • Java
阅读更多
1. socket通信:有客户端和服务端的socket代码。

2. 多线程:客户端和服务端各用一线程发送信息;服务端另有一监听线程,用于把超时的信息删除。

    这里应用到了同步,使两个线程可以操作同一个map。

代码:(类全在同一个包内)
server端:


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import java.util.HashMap;
import java.util.Map;

public class ServerNet {
	// 以毫秒为单位 
	private final static long timeLimit = 10000 ;
	private Map<String,String> map = Collections.synchronizedMap(new HashMap<String,String>());
		
	public void ServerSocketNet(){
		try{
			 ServerSocket ss = new ServerSocket(6060);
			 Socket s = ss.accept();
			 // 用于获取客户端传输来的信息
			 BufferedReader buff = new BufferedReader(new InputStreamReader(s.getInputStream()));
			 // 用于获取服务端准备响应的信息
			 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			 // 发送服务端准备响应的信息
			 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);			 
			 pw.println("您已经成功建立连接!");
			 
			 new ServerOutNet(pw, in);
			 new ServerTimeListener(map, timeLimit);
			 
			 // 显示客户端的传输来的信息
			 while(true){ 
				 String str = buff.readLine();
				 if(str.equals("exit")){
					 break;
				 }else{
					 map.put(ServerHelper.getInstance().getMapKey(), str);
					 System.out.println(str + "     map.size: " + map.size());
					 
				 }
			     System.out.println("To Client:");
				 Thread.sleep(100);
			}
			s.close();
		 }catch(Exception e){
			 e.printStackTrace();
		 }
	}
	 public static void main(String[] args){
		 new ServerNet().ServerSocketNet();
	 }
}

/**
 * server发送线程 向客户端发送响应信息
 * @author ids-user
 *
 */
class ServerOutNet extends Thread{
	private PrintWriter printWriter;
	private BufferedReader bufferedReader;
	
	ServerOutNet(PrintWriter pw,BufferedReader in){
		this.printWriter = pw;
		this.bufferedReader = in;
		start();
	 }
	
	public void run(){
		while(true){
			try{
				String inStr = bufferedReader.readLine();
				if(inStr.equals("exit")){
					printWriter.close();
					bufferedReader.close();
					break;
				}else{
					printWriter.println("From Server: " + inStr);
				}
				sleep(300);
			}catch(Exception e){
				printWriter = null;
				bufferedReader = null;
				throw new RuntimeException(e);
			}
		}
	 }
}

// 时间监听线程类。
class ServerTimeListener extends Thread{
	
	private long timeLimit;
	Map<String, String> map = new HashMap<String, String>();

	// 单例
//	private ServerTimeListener(){}
//	private final static ServerTimeListener stl = new ServerTimeListener();
//	public static ServerTimeListener getInstance(){
//		return stl;
//	}
	
	ServerTimeListener(Map<String, String> map , long timeLimit){
		this.map = map;
		this.timeLimit = timeLimit;
		start();
	}
	
	
	public void run(){
		while(true){
			try{
				// 循环map
				 long currentTime = System.currentTimeMillis();
				 for(String mapKey : map.keySet()){
			    	 long oldTime = Long.parseLong(mapKey.substring(0, mapKey.indexOf("_")));
			    	 System.out.println("currentTime - oldTime=" + (currentTime - oldTime));
			    	 if(currentTime - oldTime >= timeLimit){
			    		 map.remove(mapKey);
			    	 }
			     }
			     
				TimeUnit.MILLISECONDS.sleep(timeLimit);
				
			}catch(Exception e){
				throw new RuntimeException(e);
			}
		}
	 }
}



服务器端辅助类:ServerHelper

import java.util.Random;

public class ServerHelper {
	
	// 单例
	private ServerHelper(){	}
	private final static ServerHelper helper = new ServerHelper();
	public static ServerHelper getInstance(){
		return helper;
	}
	
	
	// 构建map的key值
	public String getMapKey(){
		
		Random random = new Random();
		String mapKey = System.currentTimeMillis() + "_" + random.nextInt(1000);
		System.out.println("map key: " + mapKey);
		return mapKey;
	}	
}



Client端:


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class ClientNet {

	public static void main(String[] args){
		try{
			Socket s = new Socket("127.0.0.1",6060);
			// 用于获取服务端传输来的信息
			BufferedReader buff = new BufferedReader(new InputStreamReader(s.getInputStream()));
			// 用于获取客户端准备响应的信息
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 
			// 发送客户端准备传输的信息	
			PrintWriter printWriter = new PrintWriter(s.getOutputStream(),true);
	    	printWriter.println("有客房端请求连接!");
	    	
	    	// 客户端使用线程池连接服务端
//	    	ExecutorService executorService = Executors.newCachedThreadPool();
//	    	executorService.execute(new ClientOutNet(printWriter,bufferedReader)); 
	    	new ClientOutNet(printWriter,bufferedReader);
	    	
			while(true){  // 显示服务端的响应信息
			    String str = buff.readLine();
			    if(str != null){
			    	System.out.println(str);
				}
//			    System.out.println("To Server:");
			    Thread.sleep(100);
			}  
			   
		}catch(Exception e){
			e.printStackTrace();
		}

	}
}


/**
 * Client 发送线程 ,向服务端发送信息
 * @author ids-user
 */
class ClientOutNet extends Thread{
	private PrintWriter printWriter;
	private BufferedReader bufferedReader;
	
	ClientOutNet(PrintWriter pw,BufferedReader in){
		this.printWriter = pw;
		this.bufferedReader=in;
		start();
	 }
	
	
	public void run(){
		while(true){
			try{
				String inStr = bufferedReader.readLine();
				if(inStr.equals("exit")){
					printWriter.close();
					bufferedReader.close();
					break;
				}else{
					printWriter.println("From Client: " + inStr);
				}
				sleep(300);
			}catch(Exception e){
				printWriter = null;
				bufferedReader = null;
				throw new RuntimeException(e);
			}
		}
	 }
}

分享到:
评论
4 楼 $会飞的鱼$ 2011-07-20  
师兄的代码写的很漂亮~~~好好学习下~~~
3 楼 wait4sth 2011-03-17  
非常感谢,正要学习,愁没实例呢
2 楼 loveegg133 2011-03-10  
mk。。。
1 楼 xiaokang1582830 2010-09-13  
不错!支持下,我现在也在研究线程和套接字!...

相关推荐

    java socket和多线程(Thread)实例 - JAVA SSH AJAX JS CSS

    java socket和多线程(Thread)实例 - JAVA SSH AJAX JS CSS - JavaEye技术网站

    Qt UDP QUdpSocket多线程实例 movetothread

    Qt UDP QUdpSocket多线程实例 movetothread

    C#多线程与Socket聊天室的实现

    基于TCP/IP协议的一对多的通讯实例。实现局域网内的多台计算机的实时信息交互的聊天室功能(外网未测试)。主要使用多线程加侦听实现,服务器负责转发所有客户端的信息。

    java 实现多线程服务器

    * &lt;p&gt;Description: 本实例使用多线程实现多服务功能。 * &lt;p&gt;Copyright: Copyright (c) 2003 * &lt;p&gt;Filename: * @author 杜江 * @version 1.0 */ class moreServer { public static void main (String [] args...

    java编程基础,应用与实例

    14.3 多线程 208 14.4 线程的优先级 210 14.5 线程的休眠与唤醒 211 14.6 线程让步 213 14.7 线程同步 214 14.7.1 同步块 216 14.7.2 同步化方法 219 14.7.3 生产者与消费者 221 14.7.4 多消费者 ...

    java高手真经 光盘源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    C#多线程数组模拟socket

    本文实例为大家分享了C#多线程数组模拟socket的具体代码,供大家参考,具体内容如下 代码如下 //实例化线程组 Thread[] clientThreads = new Thread[numThread]; for (int i = 0; i &lt; numThread; i++) { ...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    Java高手真经(编程基础卷)光盘全部源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....

    Python 通过 socket 实现服务端和客户端相互间网络通信的例子

    Python 通过 socket 实现服务端和客户端相互间网络通信的例子 通过socket实现网络通信 通过thread多线程实现同时收发

    python使用多线程+socket实现端口扫描

    今天老师上课说的内容,使用多线程+socket写一个端口扫描器 写的些许潦草,也没注释,不过问题不大,应该都能看懂 多线程+queue真的nice!! import socket import threading import time import queue import sys ...

    multi_thread_socket_filetrans

    提供了许多线程间通信的实例程序。用linux下的C语言实现。-Provides many examples of thread communication procedures. Under linux using C language.

    python实现的多线程端口扫描功能示例

    本文实例讲述了python实现的多线程端口扫描功能。分享给大家供大家参考,具体如下: 下面的程序给出了对给定的ip主机进行多线程扫描的Python代码 #!/usr/bin/env python #encoding: utf-8 import socket, sys, ...

    JAVA基础课程讲义

    通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 终止线程的典型方法(重要!!!) 171 ...

    一个开源的Java基础工具包

    增加名称、ID,调用次数和时间统计、线程停止接口等,并且在线程运行时,不允许此线程第二次启动。 2、com.baijob.commonTools.thread.Executor 线程池工具类 调用静态方法execute()启动线程,此线程在公共的...

    java程序设计实验指导代码

    第13章 多线程编程 13.1 预备知识 13.2 实验1 使用Thread类创建4线程程序 13.3 实验2 一个实现Runnable接口的小应用程序 13.4 实验3 线程同步与资源共享 13.5 实验4 wait( )和notify( )挂起与恢复线程 第14章 ...

    JAVA面试题最全集

    谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理...

Global site tag (gtag.js) - Google Analytics