新聞中心
Java實現(xiàn)服務器監(jiān)聽,接收并處理請求

創(chuàng)新互聯(lián)一直通過網(wǎng)站建設和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實效"的一站式服務,以網(wǎng)站建設、成都做網(wǎng)站、移動互聯(lián)產(chǎn)品、成都全網(wǎng)營銷服務為核心業(yè)務。10多年網(wǎng)站制作的經(jīng)驗,使用新網(wǎng)站建設技術,全新開發(fā)出的標準網(wǎng)站,不但價格便宜而且實用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡單易用,維護方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設的選擇。
在網(wǎng)絡編程中,服務器監(jiān)聽是一個重要的環(huán)節(jié),服務器需要監(jiān)聽客戶端的連接請求,接收數(shù)據(jù)并將其傳遞給相應的處理程序,本文將介紹如何使用Java實現(xiàn)服務器監(jiān)聽,接收并處理請求。
1、創(chuàng)建ServerSocket對象
我們需要創(chuàng)建一個ServerSocket對象,用于監(jiān)聽客戶端的連接請求,ServerSocket類位于java.net包中,它的構造方法接受一個整數(shù)參數(shù),表示端口號,我們可以創(chuàng)建一個監(jiān)聽8080端口的ServerSocket對象:
import java.net.ServerSocket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、接收客戶端連接
當有客戶端連接到服務器時,ServerSocket對象的accept()方法會返回一個新的Socket對象,用于與客戶端通信,我們可以使用一個循環(huán)來不斷接收新的客戶端連接:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
// 處理客戶端連接
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、處理客戶端請求
當接收到客戶端連接后,我們需要為每個客戶端連接創(chuàng)建一個新的線程,以便并發(fā)處理多個客戶端的請求,我們可以使用Thread類或Runnable接口來實現(xiàn)多線程:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ClientHandler(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ClientHandler類負責處理客戶端的請求:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import org.springframework.stereotype.Component;
@Component("clientHandler") public class ClientHandler implements Runnable{ private AtomicInteger id=new AtomicInteger(0); private Socket socket; private PrintWriter writer; private BufferedReader reader; private String name; private ExecutorService pool=Executors.newCachedThreadPool(); @Override public void run(){ try{ //讀取客戶端信息 writer=new PrintWriter(socket.getOutputStream()); reader=new BufferedReader(new InputStreamReader(socket.getInputStream())); name=(reader.readLine())==null?"":reader.readLine(); System.out.println("新用戶"+name+"已上線!"); //向所有在線用戶發(fā)送消息 pool.execute(new Runnable(){ @Override public void run(){ try{ writer=new PrintWriter(socket, true); }catch (Exception e){ e.printStackTrace(); }writer.println("歡迎"+name+"加入聊天室!"); }}); //獲取用戶輸入的消息 while((msg=reader.readLine())!=null){ pool.execute(new Runnable(){ @Override public void run(){ try{ writer=new PrintWriter(socket, true); }catch (Exception e){ e.printStackTrace(); }writer.println("<>"+name+":"+msg); }}); }catch (Exception e){ e.printStackTrace(); }finally{ //關閉資源 try{ reader=null; writer=null; socket=null; }catch (Exception e){ e.printStackTrace(); }pool=null; } } } @Override public String toString(){ return "ClientHandler [id="+id+", name="+name+"]"; } } ``` 4. 關閉服務器和資源
名稱欄目:java監(jiān)聽服務器端口
轉載來源:http://www.fisionsoft.com.cn/article/cohdsho.html


咨詢
建站咨詢
