導航:首頁 > 編程語言 > javasocket流程

javasocket流程

發布時間:2023-05-06 05:00:49

Ⅰ socket 線程 思路 java

網上參考別人的例子 改自己的程序 終於搞明白了 原來在socket的伺服器端設置線程並不是像之前想的那樣 建立一個連接後就重新開一個埠去監聽 這樣的想法遇到了很多問題 首先 當我把客戶端 弄成for循指談談環遞增的鏈接個格埠的時候 發現總是異常 因為伺服器端的新的埠建立速度總是沒有客戶端的主動連接塊 然後試圖去讓客戶端創建新埠鏈接的速度降慢 但是一直沒調試成功 並且即便是成功了 這個問侍純題還是有隱患的 因為客戶端的鏈接速度是不可控的 有兩天 這個問題沒有進展 後來在網上查到了 原來伺服器端的線程 並不是用來創建新的埠的 之前也想過 一個伺服器端不可能就連接一個客戶端 但是沒想出來解決辦法 看了例子的提示後 才做出來 伺服器端的線程是用來監聽連接客戶端的 即 當監聽到客戶端的連接請求時就會主動去創建一個socket線程去連接 完成客戶端和伺服器端的交互 後客戶端自動斷開鏈接

核心代碼

Main 函數

ServerSocket serverSocket=null

boolean listening=true

try{

serverSocket=new ServerSocket( )

//創建一個ServerSocket在埠 監聽客戶請求

}catch(IOException e) {}

while(listening){ //永遠循環監聽

newServerThread(serverSocket accept() clientnum) start()

//監聽到客戶請求 根據得到的Socket對象和

客戶計數創建服務線程 並啟動之

clientnum++ //增加客戶計數

}

serverSocket close() //關閉ServerSocket

設唯碰計ServerThread類

public class ServerThread extends Thread{

Socket socket=null //保存與本線程相關的Socket對象

int clientnum //保存本進程的客戶計數

public ServerThread(Socket socket int num) { //構造函數

this socket=socket //初始化socket變數

clientnum=num+ //初始化clientnum變數

}

public void run() { //線程主體

try{//在這里實現數據的接受和發送

lishixin/Article/program/Java/hx/201311/26230

Ⅱ java socket如何實現客戶端與客戶端的交互

問題一:客復戶端接收可以採制用下列步驟:
1、無論客戶端還是伺服器都要有能力構造實體bean(比如叫做userbean,存放用戶信息),構造userlist封裝userbean數組。並且,上述類要支持序列化和反序列化。
2、服務端將list
userlist序列化,然後利用serversocket發送。
3、客戶端利用socket接收,對userlist反序列化,遍歷userbean數組得到每一個用戶的信息。
問題二:對於socket,不存在得到還是得不到的——
你要利用tcp、udp協議先要構造和初始化socket才行。
客戶端socket和服務端socket進行全雙工通信。
即使是最簡單im演示程序,用戶的好友列表都應該考慮在伺服器端持久化和管理。
客戶端程序要想得到其好友列表,只需要執行一次」請求/響應」即可。寫這方面的程序,可以參考xmpp相關技術。

Ⅲ java中如何創建socket連接的過程

1、在打開的ie瀏覽器窗口右上方點擊齒輪圖標襪型,選擇「Internet選項」,如下圖所示:

Ⅳ java中如何創建socket連接的過程

//創建Socket 客戶端對象
Socket s = new Socket("127.0.0.1",6666);

//創建ServerSocket 伺服器端對象。專。
ServerSocket ss = new ServerSocket(6666);
//監聽伺服器連屬接
s = ss.accept();

Ⅳ java編程中,Socket通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

Ⅵ 請問Socket編程的基本步驟是怎樣的最好能寫一個簡單的程序Java演示一下,主要是接受數據。謝謝!

SERVER端:
--------------------------------------------------------
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;

{
privateSocketclientSocket;

publicServer(SocketclientSocket){
this.clientSocket=clientSocket;
}

publicvoidrun(){
DataInputStreamdis=null;
DataOutputStreamdos=null;

try{
dis=newDataInputStream(clientSocket.getInputStream());
dos=newDataOutputStream(clientSocket.getOutputStream());

while(true){
Stringtemp=dis.readUTF();
if("over".equals(temp)){
break;
}
dos.writeUTF("fromserver:"+temp);
}

}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(dis!=null){
dis.close();
}
if(dis!=null){
dos.close();
}

if(clientSocket!=null){
clientSocket.close();
}
}catch(IOExceptione){
}
}
}

publicstaticvoidmain(String[]args)throwsException{
ServerSocketss=newServerSocket(8008);
while(true){
SocketclientSocket=ss.accept();
//針對每個客戶端,啟一個Server線程專門處理此客戶端的請求。
Serverserver=newServer(clientSocket);
server.start();
}

}

}

CLIENT端:
----------------------------------------
importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.InputStreamReader;
importjava.net.Socket;

publicclassClient{

publicstaticvoidmain(String[]args)throwsException{
//輸入流1,從鍵盤進入Client。
InputStreamReaderisr=newInputStreamReader(System.in);
BufferedReaderbr=newBufferedReader(isr);

SocketclientSocket=newSocket("127.0.0.1",8008);

//輸入流2,從伺服器端進入Client的流對象。
DataInputStreamdis=newDataInputStream(clientSocket.getInputStream());

//輸出流,從Client出去,到伺服器端。
DataOutputStreamdos=newDataOutputStream(clientSocket.getOutputStream());

while(true){
//從鍵盤輸入讀取
Stringmsg=br.readLine();

//將讀取信息發送給伺服器端
dos.writeUTF(msg);

//輸入QUIT退出
if("QUIT".equals(msg)){
break;
}

//讀取從伺服器返回的信息
Stringtemp=dis.readUTF();
System.out.println(temp);
}

br.close();
dis.close();
dos.close();
clientSocket.close();
}
}

Ⅶ 用JAVA編寫一個socket通信程序。

埠監聽和建立管道。首先伺服器端綁定監聽埠,然後客戶端socket連接到這個埠,控制台輸入的字元串都會被在這個埠監聽的伺服器接收到。

Ⅷ Java Socket初步詳解

網路編程的基本模型就是客戶機到伺服器模型 簡單的說就是兩個進程之間相互通訊 然後其中一個必須提供一個固定的位置 而另一個則只需要知道這個固定的位置 並去建立兩者之間的聯系 然後完成數據的通訊就可以了 這里提供畝悉猜固定位置的通常稱為伺服器 而建立聯系的通常叫做客戶端 基於這個簡單的模型 就可以進入網路編程啦

Java對這個模型的支持有很多種Api 而這里我只想介紹有關Socket的編程介面 對於Java而言已經簡化了Socket的編程介面 首先我們來討論有關提供固定位置的服務方是如何建立的 Java提供了ServerSocket來對其進行支持 事實上當你創建該類的一個實力對象並提供一個埠資源你就建立了一個固定位置可以讓其他計算機來訪問你 ServerSocket server=new ServerSocket( );這里稍微要注意的是埠的分配必須是唯一的 因為埠是為了唯一標識每台計算機唯一服務的 另外埠號是從 ~ 之間的 前 個埠已經被Tcp/Ip 作為保留埠 因此你所分配的埠只能是 個之後的 好了 我們有了固定位置 現在所需要的就是一根連接線了 該連接線由客戶方首先提出要求 因此Java同樣提供了一個Socket對象來對其進行支持 只要客戶方創建一個Socket的實例對象進行支持就可以了 Socket client

=new Socket(InetAddress getLocalHost() );客戶機必須知道有關伺服器的IP地址 對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供 它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法

上面的方法基本可以建立一條連線讓兩台計算機相互交流了 可是數據是如何傳輸的呢?事實上I/O操作總是和網路編程息息相關的 因為底層的網路是繼續數據的 除非遠程調用 處理問題的核心在執行上 否則數據的陸帆交互還是依賴於IO操作的 所以你也必須導入java io這個包 java的IO操作也不復雜 它提供了針對於位元組流和Unicode的讀者和寫者 然後也提供了一個緩沖用於數據的讀寫

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

上面兩句就是建立緩沖並把原始的位元組流轉變為Unicode可以操作 而原始的位元組流來源於Socket的兩個方法 getInputStream()和getOutputStream()方 分別用來得到輸入和輸出 那麼現在有了基本的模型和基本的操作工具 我們可以做一個簡單的Socket常式了

服務方:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

迅型PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

這個程序的主要目的在於伺服器不斷接收客戶機所寫入的信息只到 客戶機發送 End 字元串就退出程序 並且伺服器也會做出 Receive 為回應 告知客戶機已接收到消息

客戶機代碼:

import *;

import java io *;

public class Client{

static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket(InetAddress getLocalHost() );

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

BufferedReader wt=new BufferedReader(new InputStreamReader(System in));

while(true){

String str=wt readLine();

out println(str);

out flush();

if(str equals( end )){

break;

}

System out println(in readLine());

}

server close();

}

}

客戶機代碼則是接受客戶鍵盤輸入 並把該信息輸出 然後輸出 End 用來做退出標識

這個程序只是簡單的兩台計算機之間的通訊 如果是多個客戶同時訪問一個伺服器呢?你可以試著再運行一個客戶端 結果是會拋出異常的 那麼多個客戶端如何實現呢?

其實 簡單的分析一下 就可以看出客戶和服務通訊的主要通道就是Socket本身 而伺服器通過accept方法就是同意和客戶建立通訊 這樣當客戶建立Socket的同時 伺服器也會使用這一根連線來先後通訊 那麼既然如此只要我們存在多條連線就可以了 那麼我們的程序可以變為如下:

伺服器:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

}

這里僅僅只是加了一個外層的While循環 這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和伺服器的交互 這里也就是接受到客戶的 End 消息 那麼現在就實現了多客戶之間的交互了 但是 問題又來了 這樣做雖然解決了多客戶 可是是排隊執行的 也就是說當一個客戶和伺服器完成一次通訊之後下一個客戶才可以進來和伺服器交互 無法做到同時服務 那麼要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個並行執行的問題了 所以線程是最好的解決方案

那麼下面的問題是如何使用線程 首先要做的事情是創建線程並使得其可以和網路連線取得聯系 然後由線程來執行剛才的操作 要創建線程要麼直接繼承Thread要麼實現Runnable介面 要建立和Socket的聯系只要傳遞引用就可以了 而要執行線程就必須重寫run方法 而run方法所做的事情就是剛才單線程版本main所做的事情 因此我們的程序變成了這樣:

import *;

import java io *;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

this client=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

//Mutil User but can t parallel

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}catch(IOException ex){

}finally{

}

}

public static void main(String[] args)throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

//transfer location change Single User or Multi User

MultiUser mu=new MultiUser(server accept());

mu start();

}

}

}

lishixin/Article/program/Java/hx/201311/27013

閱讀全文

與javasocket流程相關的資料

熱點內容
桌面雲配置文件分離 瀏覽:505
iphone5如何升級4g網路 瀏覽:5
團購是在哪個app 瀏覽:897
打開多個word文檔圖片就不能顯示 瀏覽:855
騰訊新聞怎麼切換版本 瀏覽:269
app安裝失敗用不了 瀏覽:326
桌面文件滑鼠點開會變大變小 瀏覽:536
手機誤刪系統文件開不了機 瀏覽:883
微信兔子甩耳朵 瀏覽:998
android藍牙傳文件在哪裡 瀏覽:354
蘋果6s軟解是真的嗎 瀏覽:310
c語言代碼量大 瀏覽:874
最新網路衛星導航如何使用 瀏覽:425
以下哪些文件屬於圖像文件 瀏覽:774
zycommentjs 瀏覽:414
確認全血細胞減少看哪些數據 瀏覽:265
文件有哪些要求 瀏覽:484
cad打開時會出現兩個文件 瀏覽:65
什麼是轉基因網站 瀏覽:48
手柄設備有問題代碼43 瀏覽:921

友情鏈接