先上代码,代码里有注释,自己看看去吧,不懂的给我留言。
ps: 注意一下客户端和服务端的 in 和 out 的实例化顺序。
在 web.xml 添加一个servlet可以让线程随着项目的启动而启动。
/**************** web.xml begin **************/
<servlet>
<servlet-name>socketManager</servlet-name>
<servlet-class>com.net.jnjc.core.ScoketManager</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>socketManager</servlet-name>
<url-pattern>/Sock</url-pattern>
</servlet-mapping>
/***************** web.xml end ***************/
/**************** SocketManager begin *****************/
package com.net.jnjc.core;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.net.jnjc.util.SocketThread;
/**
* 继承了HttpServlet对象,重写了init()方法,项目运行时即可调用到重写的init()方法
* @author qin
*
*/
@SuppressWarnings("serial")
public class ScoketManager extends HttpServlet {
//log4j对象
Logger log = LogManager.getLogger(ScoketManager.class);
@Override
public void init() {
//记录监听服务的运行
log.fatal("socketServer started success....");
try {
/*
这里就像在火车站买票,一个监听对象就相当于一个售票窗口,
客户端请求就相当于买票的人,
若只有一个售票窗口,买票的人多了,就要排队。
实例一个监听对象就相当于开一个售票窗口。
按需求和服务器性能,看自己要开多少个监听对象
*/
/*
//开多个监听对象
for(int i = 0;i< 5;i++){
//实例一个监听器
new SocketThread().start();
}
*/
//实例一个监听器
new SocketThread().start();
} catch (Exception ex) {
//记录异常信息
log.error(ex.getMessage());
ex.printStackTrace();
}
}
}
/************************ SocketManager end ***************/
这个是服务端,按照职能来说,是等候服务的请求再反馈结果。
所以先实例化 in 来获取客户端请求,再实例化 out 反馈服务端的
处理结果。
/**************** SocketThread begin ***********/
package com.net.jnjc.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
/**
* 服务端监听代码
* 继承了Thread,重写run()方法即可实现新开线程运行,新开的线程
* 运行的是重写的run()方法里面的内容。
*
* @author qin
*
*/
public class SocketThread extends Thread {
public void run() {
while (true) {
//log4j
Logger log = LogManager.getLogger(SocketThread.class);
//标识服务信息
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss.SSS");
ServerSocket ss;//socket服务监听对象
Socket socket;//获取监听得到的结果
BufferedReader in;//输入流
PrintWriter out;//输出流
try {
//设置监听的端口,并实例监听对象
ss = new ServerSocket(10000);
while (true) {
//开始监听,若没有客户端请求则线程一直停留在这里等待请求,
//一旦就有请求,就获取监听到的对象
socket = ss.accept();
InputStream sis = socket.getInputStream();// socket服务获取的输入流
// 等待读取状态
// 大于零为获取完毕
while (sis.available() <= 0)
System.out.println("inputStream is waitting...");
in = new BufferedReader(new InputStreamReader(sis));// 获取输入
String line = "";//监听到的字符串
// 读数据
while (in.ready()) {
line += in.readLine();
}
//记录下获取到的字符串流
log.warn("client request is :" + line);
out = new PrintWriter(socket.getOutputStream(), true);// 构建输出
// 输出
out.println("server response " + sdf.format(new Date()));
//关闭当前请求对象
out.close();
in.close();
socket.close();
}
} catch (IOException e) {
String msg = "\n" + e.getMessage();
for (StackTraceElement ste : e.getStackTrace()) {
msg += "\n" + ste.getClassName() + "-" + ste.getFileName()
+ "-" + ste.getMethodName() + "-"
+ ste.getLineNumber();
}
log.fatal(msg);
} catch (Exception ex) {
String msg = "\n" + ex.getMessage();
for (StackTraceElement ste : ex.getStackTrace()) {
msg += "\n" + ste.getClassName() + "-" + ste.getFileName()
+ "-" + ste.getMethodName() + "-"
+ ste.getLineNumber();
}
log.fatal(msg);
}
}
}
}
/******************** SocketThread end *******************/
这里需要注意一下 in 和 out 的顺序,我们得按照程序的流程来看,
因为这个是客户端,所以这里得先输出再得到服务端的相应结果,
所以这里得先实例化输出对象再获取输入对象。
/**************** SocketClientUtil begin **************/
package com.net.jnjc.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客户端工具类
* 发送socket信息
* @author qin
*
*/
public class SocketClientUtil {
/**
* 客户端
* 调用服务端
* @param host 服务端地址
* @param port 服务端端口
* @param msg 发送给服务端的信息
* @return 服务端的信息反馈
* @throws Exception 发送socket过程中遇到的异常
*/
public static String SocketClient(String host, int port, String msg)
throws Exception {
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
String str = "";
socket = new Socket(host, port);
out = new PrintWriter(socket.getOutputStream(), true);
out.println(msg);
while(socket.getInputStream().available()<=0);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (in.ready())
str += in.readLine();
out.close();
in.close();
socket.close();
return str;
}
}
/************************ SocketClientUtil end **********************/
这个是客户端测试调用的测试类,用的是 junit 来测试。
Test2 方法才是用作测试客户端的,不过,先得服务端运行起来才能用,不然会直接抛异常。
/********************** ThreadTest Begin *************************/
package com.net.jnjc.unit;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.Test;
import com.net.jnjc.util.SocketClientUtil;
import com.net.jnjc.util.SocketRunnable;
import com.net.jnjc.util.SocketThread;
public class ThreadTest {
@Test
public void Test() {
SocketThread thread = new SocketThread();
thread.start();
}
@Test
public void Test1() {
SocketRunnable runnable = new SocketRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
@Test
public void Test2() {
String str = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String msg = "client request " + sdf.format(new Date());
try {
str = SocketClientUtil.SocketClient("127.0.0.1", 10000, msg);
System.out.println(str);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/************************* ThreadTtest End *************************/
分享到:
相关推荐
总结来说,Java Socket多线程是构建高并发网络服务的关键技术。通过合理地设计和实现,可以有效地提升服务器的并发处理能力,为用户提供更高效的服务。在实际项目中,应根据具体需求选择适合的线程模型,例如线程池...
Java Socket多线程文件传输实例项目是一个典型的网络编程应用场景,主要涉及了Socket编程、多线程处理以及文件I/O操作等关键知识点。在这个项目中,开发者利用Java的Socket API实现了一个能够支持多个客户端同时进行...
在这个“Java Socket 多线程实例”中,我们将会探讨如何结合这两个关键概念来创建一个聊天服务器和客户端应用。 首先,`ChatServer.java` 文件通常包含了服务器端的代码。在Java中,通过`java.net.ServerSocket` 类...
Java Socket多线程简易实现是网络编程中的一个基础概念,主要应用于客户端与服务器之间的通信。在Java中,Socket是基于TCP协议的,提供了一种可靠的、面向连接的字节流通信方式。多线程则是Java并发编程的重要特性,...
Java Socket多线程聊天软件是基于Java编程语言构建的一个网络通信应用,主要利用Socket API来实现客户端与服务器之间的实时通信。在这个系统中,服务器端能够同时处理多个客户端连接,这得益于Java的多线程特性。SWT...
本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...
总的来说,Java Socket多线程通信是一种强大的工具,用于构建分布式系统和网络应用。理解如何创建和管理Socket连接,以及如何在多线程环境下处理这些连接,是成为熟练的Java网络程序员的关键步骤。通过实践和理解...
本项目"java socket多线程多人聊天室"旨在利用Java的Socket API创建一个支持多个客户端同时连接的聊天环境。在这个项目中,主要涉及三个关键组件:Server(服务器)、Client(客户端)和User(用户)。 首先,`...
Java Socket多线程文件上传下载实例项目是一种基于Java网络编程技术实现的,旨在处理大量并发连接的文件传输服务。在本项目中,Socket是客户端与服务器之间通信的基础,它允许两个应用程序通过网络交换数据。多线程...
本文将深入探讨Java Socket多线程的应用,并通过实例解析其工作原理。 一、Java Socket基础 Java Socket类代表了TCP协议中的一个连接,Socket对象由服务器端的ServerSocket监听并接受客户端的连接请求后创建。...
Java Socket多线程图片模拟视频是一种利用编程技术模拟视频播放的方法。在这个项目中,通过Java Socket通信和多线程技术,将连续的图片快速切换,从而达到类似视频流畅播放的效果。这种技术通常用于网络传输环境,...
总结起来,Java Socket多线程通讯实例展示了如何利用Java的网络编程API实现TCP通信,并通过多线程处理并发连接,这在构建例如QQ这样的聊天应用时是非常重要的技术。通过这种方式,服务端能够有效地管理大量并发的...
Java Socket 多线程通信是网络编程中的一个重要概念,它涉及到Java的基础网络API以及多线程技术。在Java中,Socket是实现客户端-服务器通信的基础,而多线程则允许程序同时处理多个任务,这对于构建能够同时服务多个...
java socket 多线程网络传输多个文件
Java Socket 多线程通信技术 Java Socket 通信技术是网络通信的关键技术之一。通过实现一个简单的服务端、客户端聊天程序,文章对 Java Socket 通信技术的原理和实现进行了详细的介绍。 网络通信设计 网络通信...
Java Socket 多线程实现文件传输是一个常见的网络编程...通过以上介绍,你应该对Java Socket多线程实现文件传输有了基本的理解。实际开发中,还需要根据具体需求进行调整和优化,例如添加进度显示、文件校验等功能。
基于多线程实现的JavaSocket客户端-服务端点对点异步通信程序代码
在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源
客户端的请求首先会进入请求队列,处理器线程池会向请求队列获取请求并且分配分配处理器,每个处理器分配一个线程。处理器可以指定interceptor,处理逻辑都实现在ResponseHandler中。空闲时,处理器线程会休眠直到有...