首頁  >  文章  >  Java  >  Java Web專案中使用Socket通訊多執行緒、長連線的方法

Java Web專案中使用Socket通訊多執行緒、長連線的方法

高洛峰
高洛峰原創
2017-01-05 14:18:352133瀏覽

很多時候在javaweb專案中我們需要用到Socket通訊來實現功能,在web中使用Socket我們需要建立一個監聽程序,在程序啟動時,啟動socket監聽。我們的應用場景是在java專案中,需要外接如一個硬體設備,透過tcp通信,取得設備傳上來的數據,並對數據做回應。

先看一下web的監聽程式碼:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class AttendSocetListener implements ServletContextListener{
private SocketThread socketThread;
public void contextDestroyed(ServletContextEvent arg) { 
if(null!=socketThread && !socketThread.isInterrupted()) 
{ 
socketThread.closeSocketServer(); 
socketThread.interrupt(); 
} 
} 
@Override
public void contextInitialized(ServletContextEvent arg) { 
// TODO Auto-generated method stub 
if(null==socketThread) 
{ 
//新建线程类 
socketThread=new SocketThread(null); 
//启动线程 
socketThread.start(); 
} 
} 
}

建立執行緒:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class SocketThread extends Thread
{
private ServerSocket serverSocket = null; 
public SocketThread(ServerSocket serverScoket){ 
try { 
if(null == serverSocket){ 
this.serverSocket = new ServerSocket(); 
System.out.println("socket start"); 
} 
} catch (Exception e) { 
System.out.println("SocketThread创建socket服务出错"); 
e.printStackTrace(); 
} 
} 
public void run(){ 
while(true){ 
try { 
if(serverSocket==null){
break;
}else if(serverSocket.isClosed()){
break;
}
Socket socket = serverSocket.accept(); 
if(null != socket && !socket.isClosed()){ 
//处理接受的数据 
Thread t = new Thread(new SocketOperate(socket)); 
t.start(); 
}else{
break;
}
}catch (Exception e) { 
System.out.println("SocketThread创建socket服务出错"); 
e.printStackTrace(); 
} 
} 
} 
public void closeSocketServer(){ 
try { 
if(null!=serverSocket && !serverSocket.isClosed()) 
{ 
serverSocket.close(); 
} 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} 
}

處理接受到的資料:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class SocketOperate implements Runnable { 
private Socket socket; 
//该线程所处理的Socket所对应的输入流 
BufferedReader br = null; 
String str = null; 
String content = null; 
InputStreamReader reader=null; 
public SocketOperate(Socket socket) throws IOException 
{ 
this.socket = socket; 
reader = new InputStreamReader(this.socket.getInputStream(),"utf-"); 
br = new BufferedReader(reader); 
} 
@Override
public void run() 
{ 
try
{ 
// 采用循环不断从Socket中读取客户端发送过来的数据 
while (true) 
{ 
content = readFromClient(); 
System.out.println(content);
if (content == null) 
{ 
break; 
} 
OutputStream os = socket.getOutputStream(); 
os.write(("RES, OK,<年班,小明>, ,#" + "\n").getBytes("utf-")); 
os.flush();
} 
} 
catch (IOException e) 
{ 
e.printStackTrace(); 
} 
} 
//定义读取客户端数据的方法 
private String readFromClient() 
{ 
try
{ 
str = br.readLine(); 
return str; 
} 
//如果捕捉到异常,表明该Socket对应的客户端已经关闭 
catch (IOException e) 
{ 
try {
br.close();
reader.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 
} 
return null; 
} 
}

客戶端程式碼:

package
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) throws UnknownHostException, IOException {
Socket socket=new Socket("...",);
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
int i=;
while(socket.isConnected()){
os.print("BEAT,,,,.,,#"+"\n");
os.flush();
System.out.println("Client:"+i);
System.out.println("Server:"+is.readLine());
i++;
} 
//继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}
}

更多Java Web專案中使用Socketet方法相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn