javasocket線程
㈠ java socket 線程
以前寫過一個簡單的遠程式控制制軟體(命令行控制,就是在本機發個命令,在遠程機器執行),用的即使Socket,代碼找不到了,但原理很簡單。就是自己定義一個簡單協議,簡單點就用Java序列化,封一個自定義命令對象,每次發一個對象過去,對方接受後,執行命令對象就是了。
下面發一個間的JavaSocket例子:
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassJavaXmlSocket{
/**
*@paramargs
*@throwsIOException
*@throwsClassNotFoundException
*/
publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{
//TODOAuto-generatedmethodstub
finalServerSocketss=newServerSocket(32788);//創建服務端
newThread(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
Sockets2=ss.accept();
ObjectOutputStreamoutput_s2;
ObjectInputStreaminput_s2;
output_s2=newObjectOutputStream(s2.getOutputStream());//服務端輸出流
input_s2=newObjectInputStream(s2.getInputStream());//服務端輸入流
//服務端向客戶端發送消息
output_s2.writeObject("hello");
Stringstr=(String)input_s2.readObject();
System.out.println("服務端接收端客戶端發送的消息:"+str);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}.start();//啟動一個線程服務端偵聽客戶端連接
newThread(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
Sockets1=newSocket("127.0.0.1",32788);//創建客戶端,注冊並綁定ServerSocket
ObjectOutputStreamoutput_s1;
ObjectInputStreaminput_s1;
output_s1=newObjectOutputStream(s1.getOutputStream());//客戶端輸出流
input_s1=newObjectInputStream(s1.getInputStream());//客戶端輸入流
//客戶端向服務端發送消息
output_s1.writeObject("hello");
Stringstr2=(String)input_s1.readObject();
System.out.println("客戶端接收端服務端發送的消息:"+str2);
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}.start();////啟動一個線程客戶端端連接服務端
try{
//如果你保證Main方法不會退出,就不需要這個延時。
Thread.sleep(5000);//延時5秒等待消息處理結束關閉服務端。
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//關閉服務
ss.close();
}
}
㈡ java socket伺服器端線程卡死
對於socket通信的操作,不要放在主線程,另開一個子線程,順便一說,accept這個方法是堵塞的,在沒有收到消息的情況下會一直堵塞在那裡,所以如果你客戶端沒發送數據給服務端,那麼基本服務端所在那條線程會停滯在那個方法,估計就這原因讓你的程序看起來是卡死的,所以咯,別把通信的操作寫在主線程,要寫在子線程
㈢ java一個Socket連接多線程是否能操作兩個讀取流
可以啊 ,不過需要新建兩個實現Runnable 借口的類,重寫run方法,一個實現讀取,另一個實現輸出的功能。再用兩條線程分別操作這兩個方法。
㈣ java多線程socket通信原理是什麼
第一,程序是通過分時進行服務的。就是說一個程序監聽一個埠,第一秒可以從別的地方來一個包,第二秒可以從另一個地方來一個包。
第二,每個socket都會有包發送來的ip地址和埠號,伺服器向這個ip對應機器的埠發送數據以回應對方。
㈤ java socket 如何使輸入輸出流分別在不同線程工作
你這個問題我讀的不是很懂
Socket連接到ServerSocket後會返回一個Socket對象給伺服器,伺服器就通過這個Socket對象和客
戶端的Socket進行溝通,通過輸入輸出流取得和發送消息,我用到的對象有InputStream、
OutputStream(通過Socket的get****Stream獲得輸入輸出流),ObjectOutputStream、
ObjectInputStream(用於發送和接收一個對象)
接收端:肯定要開一個線程獨立運行,才能達到發送和接收消息互不幹擾
發送端:即一個方法,需要發送東西時調用,函數帶個發送的對象作為參數
大概就這些吧,希望能幫到你
㈥ java socket多線程的問題可以多個線程使用同一個socket嗎
可以寫個demo試一下啊,應該是可以的,socket接收到的消息只能被其中一個線程接收。線程1 和2 接受到的肯定不是同一個消息。會有先後之分。看你怎麼控制。比如從接收的消息是ABCD,那麼這相當於一個資源。線程1和2在這里拿消息,拿到之後,socket裡面就少了,比如線程1拿到AB,線程2拿到CD
㈦ Java多線程Socket的關閉問題
創建一個新線程時將這個線程對象的引用賦給一個變數:
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
在你的線程類中應該提供一個方法,用於關閉這個線程所創建的socket連接。例如你的MyThread類中應該提供一個關閉socket的方法:
public void closeSocket()
{
//這里關閉當前對象的socket
}
這樣,如果你想關閉thread1中的連接(該連接使用8888埠),則只要調用這個方法:
thread1.closeSocket();
㈧ 關於 java socket的消息推送問題
關於 java socket的消息推送問題,首先:開啟服務端,並暴露出埠。然後通過一個while的死循環去不停的接收來自客戶端的socket,並且通過一個ArrayList來維護。並且通過子線程去對list中的socket進行操作。其次:客戶端去訪問伺服器的埠。開啟一個子線程去不停的接收來自服務端的消息。
然而關於推送服務的更多內容,可以通過深圳極光公司了解一下。深圳市和訊華谷信息技術有限公司(極光 Aurora Mobile)成立於2011年,是中國領先的開發者服務提供商,專注於為開發者提供穩定高效的消息推送、一鍵認證以及流量變現等服務,助力開發者的運營、增長與變現。
同時,極光的行業應用已經拓展至市場洞察、金融風控與商業地理服務,助力各行各業優化決策、提升效率。