Java 웹 프로젝트에서 Socket을 사용하여 다중 스레드, 긴 연결을 통신하는 방법

자바 웹 프로젝트에서 우리는 Socket 통신을 사용하여 기능을 실현해야 할 때가 많다. 웹에서 Socket을 사용하려면 프로그램이 시작될 때 socket 감청을 시작해야 한다.우리의 응용 장면은java 프로젝트에서 하드웨어 장치와 같은 외부 연결을 필요로 하고 tcp통신을 통해 장치가 전송한 데이터를 얻고 데이터에 응답해야 한다.
먼저 웹의 감청 코드를 보십시오.

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,< , >, ,#" + "
").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,,,,.,,#"+"
"); os.flush(); System.out.println("Client:"+i); System.out.println("Server:"+is.readLine()); i++; } // os.close(); // Socket is.close(); // Socket socket.close(); // Socket } }
위에서 설명한 것은 여러분에게 소개된 자바 웹 프로젝트에서 Socket 통신을 사용하여 다중 스레드, 긴 연결을 하는 방법입니다. 여러분에게 도움이 되기를 바랍니다!

좋은 웹페이지 즐겨찾기