Ⅰ 用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個線程
也就是說
一條線程在接受新信息的同時
還有一條線程
是讓你來發信息的