今天在网上看了一些网络交互方面的文章,就以为网友的例子做了下更改,在这你跟大家分享一下:
例中,服务器中的ServerSocket服务是随着tomcat启动而启动的,服务器关闭后ServerSocket 也随之关闭。
1.配置web.xml,在web.xml 的节点中添加以下内容:
<context-param>
<param-name>socketPort</param-name>
<param-value>3800</param-value>
</context-param>
<listener>
<description>Socket 服务随web 启动而启动</description>
<listener-class>com.blues.socket.ServiceListener</listener-class>
</listener>
2.监听类:ServiceListener.java
package com.blues.socket;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServiceListener implements ServletContextListener{
private SctService service;
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("Server ==> Stop");
if (service != null && service.isInterrupted()) {
service.closeServerSocket();
service.interrupt();
}
}
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("Server ==> Start");
ServletContext servletContext = sce.getServletContext();
if(service == null){
// servlet上下文初始化时启动socket服务端线程
new SctService(null, servletContext).start();
}
}
}
3.服务器端:SctService.java
package com.blues.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.servlet.ServletContext;
public class SctService extends Thread {
private ServerSocket mServerSocket;
public SctService(ServerSocket serverSocket, ServletContext context) {
// 从web.xml中context-param节点获取socket端口
String port = context.getInitParameter("socketPort");
if (serverSocket == null) {
try {
mServerSocket = new ServerSocket(Integer.parseInt(port));
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
while (!this.isInterrupted()) { // 线程未中断执行循环
try {
//创建socket对象
Socket socket = mServerSocket.accept();
if (socket != null){
//接收Client发来的请求消息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 从流中读取消息内容
String request = br.readLine();
// 对请求做处理后,生成响应response
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("I get Your Message : " + request);
pw.flush(); // 刷新缓冲区
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void closeServerSocket() {
try {
if (mServerSocket != null && !mServerSocket.isClosed())
mServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 客户端 SctClient.java
package com.blues.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class SctClient {
public static void main(String[] args) {
createSocketClient("127.0.0.1", 3800);
}
public static void createSocketClient(String host, int port) {
String requestMsg = "[I AM NEO]好的";
Socket socket = null;
PrintWriter pw = null;
BufferedReader br = null;
try {
//利用Server的IP和端口创建socket对象
socket = new Socket(host, port);
//创建writer对象,并向Server发送请求
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "GBK")));
pw.println(requestMsg);
pw.flush();
//接收Server相应信息,并做进一步处理
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("OK--> "+ br.readLine());
}
catch (UnknownHostException e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("The Server : "+host+" is Unknown !");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
接触这方面不是太多,欢迎大家点评。