『壹』 如何實現java和tcp的連接
TCP: ServerSocket Socket--->學一下JAVA網路編程吧,很簡單,一個TCP和UDP
『貳』 java 調用tcp用什麼jar好
如果想用封裝得比較好,建議使用Mina,使用相對比較簡單,它屏蔽掉了細節;如果對性能要求比較高的,建議用netty,使用起來稍微復雜點,因為它沒有完全屏蔽細節。
『叄』 java TCP編程問題,我是新手
客戶端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket socket = new Socket("localhost", 9003);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(isr);
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要問電腦的話:");
String client = scanner.next();
pw.println(client);
pw.flush();
String reply = br.readLine();
System.out.println("電腦說:" + reply);
br.close();
isr.close();
pw.close();
socket.close();
}
}
服務端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9003);
while(true){
Socket socket = serverSocket.accept();
System.out.println("伺服器啟動");
InputStreamReader isr = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(isr);
PrintWriter pw = new PrintWriter(socket.getOutputStream());
HashMap<String, String> hs = new HashMap<String, String>();
hs.put("電腦啊電腦誰是世界上最帥的人", "");
hs.put("電腦啊電腦誰是世界上最壞的人", "閆鳴");
hs.put("電腦啊電腦誰是世界最三的人", "張鑫");
hs.put("電腦啊電腦誰是世界最二的人", "陳通");
String client = br.readLine();
if (hs.containsKey(client)) {
String reply = hs.get(client);
pw.println(reply);
}else {
pw.println("丫的,好好說我不是隨便的人");
}
pw.close();
br.close();
isr.close();
}
}
}
看看能用不
『肆』 java 如何調用tcp
建議樓主下載一個中文版的jdk幫助文檔,經常看一看對學習java很有幫助 樓主好運
『伍』 java代碼TCP/IP網路通信伺服器客戶端,實現雙方信息交互。
packagecom.weixin.test;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.InetAddress;
importjava.net.ServerSocket;
importjava.net.Socket;
importorg.junit.Test;
publicclassScoketTest{
@Test
publicvoidclient()throwsException{
InetAddressi=InetAddress.getByName("127.0.0.1");
Sockets=newSocket(i,9000);
OutputStreamoutputStream=s.getOutputStream();
outputStream.write("服務端你好,我是客戶端哦!".getBytes());
s.shutdownOutput();
InputStreaminputStream=s.getInputStream();
intlength=0;
byte[]bytes=newbyte[1024];
while((length=inputStream.read(bytes))!=-1){
System.err.println(newString(bytes,0,length));
}
inputStream.close();
outputStream.close();
s.close();
}
@Test
publicvoidserver()throwsException{
ServerSocketserverSocket=newServerSocket(9000);
Socketsocket=serverSocket.accept();
InputStreaminputStream=socket.getInputStream();
OutputStreamoutputStream=socket.getOutputStream();
intlength=0;
byte[]bytes=newbyte[1024];
while((length=inputStream.read(bytes))!=-1){
System.err.println(newString(bytes,0,length));
}
outputStream.write("客戶端你好,本王已收到!".getBytes());
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
『陸』 Java TCP/IP協議的Socket如何設置埠復用
你的其中一端的連接沒有被及時釋放掉的原因是:你沒有順利地進行TCP連接關閉的流程。最近我就因為這個問題頭疼了好久,現在終於找到真正的原因和解決辦法了!關鍵點是:在調用close之前先發送一次數據(例如,out.write(0);)。接下來我用通俗的語言來闡述原因。
如果你兩端的程序都是在傳送完數據後直接調用Socket的close方法斷開連接的話,這就會有一個調用close方法誰先誰後的問題,先調用者是主動關閉TCP連接的那一方,而後調用者就是被動關閉TCP連接的那一方。
關閉TCP連接的過程中,雙方總共有3個報文需要發送,主動關閉方只需發送1個報文,就是斷開請求的報文,被動關閉方要發送2個報文,分別是 回應主動關閉方發來的斷開請求報文的第一次確認報文和 第二次確認報文,第二次的確認報文用來確認已經沒有數據需要發送了。
主動關閉方發送了斷開請求報文後,就進入了等待被動關閉方發送確認報文的狀態,一般情況下,被動關閉方馬上就會發送第一次確認報文。主動關閉方收到第一次確認報文後,就會等被動關閉方的第二次確認報文,直到超時,套接字資源被操作系統回收(P.S. 雖然書上不是這么說的,但是實際的OS就是這么處理的,原因下面再說)。此時如果被動關閉方發送了第二次確認報文,整個TCP連接關閉流程就順利結束了,所有資源就會被OS回收。
重點來了,問題在於,作為被動關閉方的程序中,在主動關閉方等待被動關閉方發送第二次確認報文時,就算執行了Socket的close也不會發送第二次確認報文,只有向主動關閉方發送數據(任意)後,被動關閉方才會發送第二次確認報文,整個流程才能順利進行,TCP連接的資源才會被釋放,下次才能重復使用同個套接字。
我自己實驗出來的結果是:在兩端的代碼中(只有一端發送一端接收),都只使用
out.write(0);
me.close();
進行TCP連接的斷開,out是Socket的OutputStream,me是已連接的Socket對象。結果,無論重復多少次運行,都能不間斷地順利運行,每次運行結束後,用資源監視器看TCP連接情況,都看到所使用的連接資源都已經被釋放,並沒有等待2MSL時間後才被釋放,所以實際的OS的處理跟理論上的不一樣。所以你的程序要等一段時間後才能再次使用同個埠並不是因為存在2MSL的等待時間,而是因為TCP連接關閉流程沒有順利進行,但是所使用的進程已經退出,OS就會自動幫你回收資源,不過需要等超時後才處理。(P.S. 我測試的OS是Windows)
如果兩端的程序斷開TCP連接時都是直接開始斷開的過程而沒有延時的話,誰是主動關閉方就不確定,兩端的程序中的斷開TCP連接的代碼就得有發送數據的部分,如果其中有一方延時了,那延時的一方就有很大的概率是被動關閉方,另一方在調用close前就不需要發送數據了。
還有,就算TCP連接關閉的流程順利進行,但是,下次使用同個套接字(兩端套接字跟之前的相同)前得延時一下,幾百毫秒就夠了(具體自己調整),因為OS回收套接字資源是需要時間的,關閉TCP連接後就立馬創建兩端套接字跟所關閉的連接的兩端套接字相同的連接也有可能因為仍然被佔用而報錯。
『柒』 java如何通過tcp發送指令
以下是一個展示java使用tcp通訊的簡單例子,包括伺服器和客戶端代碼:
/**
*TCPServer
*/
import java.io.*;
import java.net.*;
class TCPServer{
public static void main(String[] args)throws IOException{
ServerSocket listen = new ServerSocket(5050);
Socket server = listen.accept();
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
char c = (char)in.read();
System.out.println("收到:" + c);
out.write('s');
out.close();
in.close();
server.close();
listen.close();
}
}
/**
*TCPClient
*/
import java.io.*;
import java.net.*;
class TCPClient{
public static void main(String[] args)throws IOException{
Socket client = new Socket("127.0.0.1" , 5050);
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
out.write('c');
char c = (char)in.read();
System.out.println("收到:" + c);
out.close();
in.close();
client.close();
}
}
『捌』 java中怎麼用TCP發送數據
println和 print的區別 還是參照javadoc比較准確,就是最後是否跟上一個換行。這種函數含義的解釋,查手冊是最准確的。
s.getOutputStream() 返回的結果 直接就是 OutputStream 這個類本身就是用於發送 byte[]的。
字元串轉化成 byte[] 直接調用getBytes。
LZ應該詳細閱讀java手冊。對於已經接觸到的類 比如String,這種基本的,要看看它所有的函數實現。這就和學英語背單詞一樣,必須要有量的上去才行。
『玖』 java的TCP和HTTP有什麼區別
TCP協議對應於傳輸層,而HTTP協議對應於應用層,從本質上來說,二者沒有可比性。Http協議是建立在TCP協議基礎之上的,當瀏覽器需要從伺服器獲取網頁數據的時候,會發出一次Http請求。Http會通過TCP建立起一個到伺服器的連接通道,當本次請求需要的數據完畢後,Http會立即將TCP連接斷開,這個過程是很短的。所以Http連接是一種短連接,是一種無狀態的連接。所謂的無狀態,是指瀏覽器每次向伺服器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,伺服器進程中就能保持住這個連接並且在內存中記住一些信息狀態。而每次請求結束後,連接就關閉,相關的內容就釋放了,所以記不住任何狀態,成為無狀態連接。