導航:首頁 > 編程語言 > java多線程tcp

java多線程tcp

發布時間:2023-05-09 18:14:59

Ⅰ 用java多線程實現伺服器與客戶端之間的文件傳輸的代碼!!!急!!!!

程序分Server和Client

伺服器端打開偵聽的埠,一有客戶端連接就創建兩個新的線程來負責這個連接

一個負責客戶端發送的信息(ClientMsgCollectThread 類),

另一個負責通過該Socket發送數據(ServerMsgSendThread )

Server.java代碼如下:

/*
* 創建日期 2009-3-7
*
* TODO 要更改此生成的文件的模板,請轉至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/
package faue.MutiUser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 伺服器端
*
* @author Faue
*/
public class Server extends ServerSocket {

private static final int SERVER_PORT = 10000;

/**
* 構造方法,用於實現連接的監聽
*
* @throws IOException
*/
public Server() throws IOException {
super(SERVER_PORT);

try {
while (true) {
Socket socket = super.accept();

new Thread(new ClientMsgCollectThread(socket), "getAndShow"
+ socket.getPort()).start();
new Thread(new ServerMsgSendThread(socket), "send"
+ socket.getPort()).start();

}
} catch (IOException e) {
e.printStackTrace();
}

}

public static void main(String[] args) throws IOException {
new Server();
}

/**
* 該類用於創建接收客戶端發來的信息並顯示的線程
*
* @author Faue
* @version 1.0.0
*/
class ClientMsgCollectThread implements Runnable {

private Socket client;

private BufferedReader in;

private StringBuffer inputStringBuffer = new StringBuffer("Hello");

/**
* 得到Socket的輸入流
*
* @param s
* @throws IOException
*/
public ClientMsgCollectThread(Socket s) throws IOException {
client = s;

in = new BufferedReader(new InputStreamReader(client
.getInputStream(), "GBK"));
}

public void run() {
try {

while (!client.isClosed()) {
inputStringBuffer.delete(0, inputStringBuffer.length());
inputStringBuffer.append(in.readLine());

System.out.println(getMsg(inputStringBuffer.toString()));
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");

}
}

/**
* 構造顯示的字元串
*
* @param line
* @return
*/
private String getMsg(String line) {
return client.toString() + " says:" + line;
}

}

/**
* 該類用於創建發送數據的線程
*
* @author Faue
* @version 1.0.0
*/
class ServerMsgSendThread implements Runnable {

private Socket client;

private PrintWriter out;

private BufferedReader keyboardInput;

private StringBuffer outputStringBuffer = new StringBuffer("Hello");

/**
* 得到鍵盤的輸入流
*
* @param s
* @throws IOException
*/
public ServerMsgSendThread(Socket s) throws IOException {
client = s;

out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));

}

public void run() {
try {

while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
outputStringBuffer.append(keyboardInput.readLine());

out.println(outputStringBuffer.toString());
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");

}
}

}

}

客戶端:

實現基於IP地址的連接,連接後也創建兩個線程來實現信息的發送和接收

/*
* 創建日期 2009-3-7
*
*/
package faue.MutiUser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
* 客戶端
*
* @author Faue
*/
public class Client {

private Socket mySocket;

/**
* 創建線程的構造方法
*
* @param IP
* @throws IOException
*/
public Client(String IP) throws IOException {

try {
mySocket = new Socket(IP, 10000);
new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"
+ mySocket.getPort()).start();
new Thread(new ClientMsgSendThread(mySocket), "send"
+ mySocket.getPort()).start();

} catch (IOException e) {
//e.printStackTrace();
System.out.println("Server.IP:" + IP
+ " port:10000 can not be Connected");
}
}

public static void main(String[] args) throws IOException {
try {
new Client(args[0]);
} catch (Exception e) {
System.out.println("輸入的IP地址錯誤");
}
}

/**
* 該類用於創建接收服務端發來的信息並顯示的線程
*
* @author Faue
* @version 1.0.0
*/
class ServerMsgCollectThread implements Runnable {

private Socket client;

private BufferedReader in;

private StringBuffer inputStringBuffer = new StringBuffer("Hello");

/**
* 得到Socket的輸入流
*
* @param s
* @throws IOException
*/
public ServerMsgCollectThread(Socket s) throws IOException {
client = s;

in = new BufferedReader(new InputStreamReader(client
.getInputStream(), "GBK"));
}

public void run() {
try {

while (!client.isClosed()) {
inputStringBuffer.delete(0, inputStringBuffer.length());
inputStringBuffer.append(in.readLine());
System.out.println(getMsg(inputStringBuffer.toString()));
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}

/**
* 構造輸入字元串
*
* @param line
* @return
*/
private String getMsg(String line) {
return client.toString() + " says:" + line;
}

}

/**
* 該類用於創建發送數據的線程
*
* @author Faue
* @version 1.0.0
*/
class ClientMsgSendThread implements Runnable {

private Socket client;

private PrintWriter out;

private BufferedReader keyboardInput;

private StringBuffer outputStringBuffer = new StringBuffer("Hello");

/**
* 得到鍵盤的輸入流
*
* @param s
* @throws IOException
*/
public ClientMsgSendThread(Socket s) throws IOException {
client = s;

out = new PrintWriter(client.getOutputStream(), true);
keyboardInput = new BufferedReader(new InputStreamReader(System.in));

}

public void run() {
try {

while (!client.isClosed()) {
outputStringBuffer.delete(0, outputStringBuffer.length());
outputStringBuffer.append(keyboardInput.readLine());

out.println(outputStringBuffer.toString());
}
out.println("--- See you, bye! ---");
} catch (IOException e) {
//e.printStackTrace();
System.out.println(client.toString() + " is closed!");
System.exit(0);
}
}

}

}

如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!

vaela

Ⅱ Java的多線程和網路UDP和TCP怎麼理解它們有什麼聯系

線程是計算機任務執行的最小單位,多線程也就是說一台計算機同時可以干好幾件事,例如同時打字和聽音樂,而單線程就是打字時只能打字,其他的幹不了。
udp和tcp是兩種協議,網路協議是分層的,他們都是傳輸層協議。所以協議就是一組約定的規則,沒有規矩不成方圓嘛。

Ⅲ 求java網路高手,tcp最大連接問題

網路上盛傳的那個改連接數,我認為基本上沒用,關鍵是你要了解他的原理,
它的作用是改變單位時間內的並發連接數,也就是說你寫個程序,想要在1秒內連接超過50(假設)此連接,是不被允許的,你只能達到10個,我認為一般應用足夠了,比如下載應用,1秒不夠,稍後軟體都會重試,並不會影響你的下載速度,像windows 2003這樣的操作系統,是不會做此限制的,作為伺服器,它的目標就是提高網路吞吐量。
這樣解釋能明白否?

Ⅳ TCP多線程異常報錯java.net.ConnectException: Connection refused: connect

看下對應埠的服務,有並發量的限制吧

Ⅳ java socket多線程問題,我寫了一個socket tcp服務端,高手來進來看下,謝啦。是關於多客戶端並聯的問題

不對,你應該單獨寫個一個處理線程類,如果需要的連接就new一下,因為每次new一下,專線程的名字都不一樣,但屬如果後期要用到銷毀的時候,最好寫一個hasMap存儲這些線程,當下線時,就根據values來銷毀或遍歷一下hasMap,獲取到線程的名字,然後就destroy();
韓順平java視頻教程里的qq項目里有詳細的解說!

Ⅵ Java的多線程和網路UDP和TCP怎麼理解它們有什麼聯系

只簡單的描述下我自己的想法
至於理論性的東西
你還是看看書上的
解釋的都比較全面
多線程和網路有什麼聯系
一個最明顯的
就是聊天的時候我們需要接受好友信息或者發送信息
單獨這兩個操作
就需要2個線程
也就是說
一條線程在接受新信息的同時
還有一條線程
是讓你來發信息的

閱讀全文

與java多線程tcp相關的資料

熱點內容
android藍牙傳文件在哪裡 瀏覽:354
蘋果6s軟解是真的嗎 瀏覽:310
c語言代碼量大 瀏覽:874
最新網路衛星導航如何使用 瀏覽:425
以下哪些文件屬於圖像文件 瀏覽:774
zycommentjs 瀏覽:414
確認全血細胞減少看哪些數據 瀏覽:265
文件有哪些要求 瀏覽:484
cad打開時會出現兩個文件 瀏覽:65
什麼是轉基因網站 瀏覽:48
手柄設備有問題代碼43 瀏覽:921
怎麼他么怎麼又網路了 瀏覽:649
java會出現內存泄露么 瀏覽:617
蘋果4s鎖屏後怎麼還顯示歌曲 瀏覽:207
鴻蒙系統文件管理哪些可以刪除 瀏覽:550
ubuntuqt創建工程沒有配置文件 瀏覽:126
網站登錄變成其他網站怎麼處理 瀏覽:202
ug數控編程學校有哪些 瀏覽:203
java圖片上傳顯示 瀏覽:402
ppt的文件名後綴 瀏覽:902

友情鏈接