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);
}
}
}
}
分享到:
相关推荐
Java Socket多线程文件传输实例项目是一个典型的网络编程应用场景,主要涉及了Socket编程、多线程处理以及文件I/O操作等关键知识点。在这个项目中,开发者利用Java的Socket API实现了一个能够支持多个客户端同时进行...
在这个“Java Socket 多线程实例”中,我们将会探讨如何结合这两个关键概念来创建一个聊天服务器和客户端应用。 首先,`ChatServer.java` 文件通常包含了服务器端的代码。在Java中,通过`java.net.ServerSocket` 类...
Java Socket和多线程是两种在Java编程中至关重要的概念,它们在开发网络应用程序和并发处理方面发挥着关键作用。让我们深入探讨这两个主题,并结合AJAX、JS、CSS等相关技术来理解它们如何协同工作。 首先,Java ...
总结来说,Java Socket多线程是构建高并发网络服务的关键技术。通过合理地设计和实现,可以有效地提升服务器的并发处理能力,为用户提供更高效的服务。在实际项目中,应根据具体需求选择适合的线程模型,例如线程池...
在这个实例中,我们关注的是服务器端的多线程应用,这在处理多个并发连接时尤其有用。多线程允许服务器同时处理多个客户端请求,提高系统效率和响应速度。 在Java中,Socket类代表一个网络连接,ServerSocket类用于...
总结起来,Java Socket多线程通讯实例展示了如何利用Java的网络编程API实现TCP通信,并通过多线程处理并发连接,这在构建例如QQ这样的聊天应用时是非常重要的技术。通过这种方式,服务端能够有效地管理大量并发的...
本文将深入探讨Java Socket多线程的应用,并通过实例解析其工作原理。 一、Java Socket基础 Java Socket类代表了TCP协议中的一个连接,Socket对象由服务器端的ServerSocket监听并接受客户端的连接请求后创建。...
本篇文章将深入探讨如何在C#中利用多线程和socket技术创建一个聊天室实例。 首先,理解`socket`的概念至关重要。Socket是网络编程中的基本接口,它允许应用程序通过网络发送和接收数据。在C#中,我们可以使用System...
本实例主要探讨的是使用C++实现基于Socket的多线程通信,具体涉及了VC++(Visual C++)环境下的开发,以及C/S(Client/Server)架构的双向通信模式。下面我们将详细讲解相关知识点。 首先,Socket是网络通信的基本...
在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...
总结来说,Java Socket的多线程通信是一个关键的网络编程概念,它使得服务器能够同时处理多个客户端请求,提高了服务的响应速度和并发能力。结合特定的工具如XtreamXml,可以进一步优化数据的传输和处理效率。
《Java2.0网络多线程编程实例教程》是一本由李荣贵等人编写的书籍,专注于Java2.0(即Java SE 2)平台下的网络编程和多线程技术。该书通过丰富的实例,旨在帮助读者深入理解和掌握这两项核心的Java开发技能。 在...
本实例探讨的是如何利用C#进行Socket多线程编程来构建一个聊天程序,这对于理解和掌握网络通信以及并发处理至关重要。 首先,我们要理解Socket编程。Socket是网络通信的基础,它为两台计算机之间的数据交换提供了...
文档"C#_Socket多线程编程实例.doc"很可能会包含详细的代码示例,讲解如何结合C#的Socket和多线程特性实现具体的网络应用程序,比如简单的聊天服务器或文件传输应用。 总之,掌握C#的Socket多线程编程是开发高效、...
在Java编程中,Socket...综上所述,这个Java Socket多线程文件上传下载实例涵盖了Socket通信、多线程处理以及文件操作等多个核心概念。通过实践这个实例,开发者可以深入理解网络编程和并发处理在实际应用中的运用。
Java多线程Socket聊天程序是基于Java编程语言实现的一个网络通信应用,主要涉及了Java的Socket编程和多线程技术。这两个核心概念在Java中占据了非常重要的地位,特别是在开发网络应用和服务端系统时。 首先,Java ...
本文将深入探讨C#中Socket多线程编程的实例,以此来展示如何在C#环境下实现高效的网络通信。 首先,套接字是基于TCP/IP协议族的一种网络通信机制。在Windows平台上,套接字API是Winsock库提供的。而对于C#开发者来...
在Java中,实现多线程主要通过两种方式:继承Thread类和实现Runnable接口。在这个端口扫描程序中,通常会采用实现Runnable接口的方法,因为这样可以避免单继承的限制,同时可以通过Thread类的构造函数创建新的线程...