我使用線程和插座爲先,所以我試圖讓聊天(本地)港口問題與Java插座
客戶端A(實際上是服務器):
public class ClientA {
public static void main(String[] args) {
ServerSocket servsock = null;
try {
servsock = new ServerSocket(9998);
Socket conn = servsock.accept();
System.out.println("server socket listening on local port : " + servsock.getLocalPort());
System.out.println("socket listening on local port : " + conn.getLocalPort());
System.out.println("socket listening on port : " + conn.getPort());
servsock.close();
TReadingSock tls = new TReadingSock(conn);
tls.start();
TWritingSock tes = new TWritingSock(conn);
tes.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端B ,實際的客戶端:
public class ClientB {
public static void main(String[] args) {
Socket sock = null;
try {
sock = new Socket("localhost", 9998);
System.out.println("socket listening on local port : " + sock.getLocalPort());
System.out.println("socket listening on port : " + sock.getPort());
} catch (IOException e) {
e.printStackTrace();
}
TReadingSock tls = new TReadingSock(sock);
tls.start();
TWritingSock tes = new TWritingSock(sock);
tes.start();
}
}
打印顯示此:
客戶A:
server socket listening on local port : 9998
socket listening on local port : 9998
socket listening on port : 50875
客戶B:
socket listening on local port : 50875
socket listening on port : 9998
所以,愚蠢的,因爲它的出現,我有嚴重的問題,理解整個插座的事情,我來到這裏的唯一的事情就是我的計劃是在不同的端口上偵聽,我不明白爲什麼。我想這對一些人來說一定是顯而易見的,所以我請求你的幫助來照亮我!
在此先感謝。
編輯:謝謝你的所有答案。事情是,對我來說,你需要一個ServerSocket來監聽端口並接受任何試圖連接的客戶端。當它完成時,它會返回一個Socket對象,我將它傳遞給我的線程以便他們可以完成他們的工作。這是ClientA的。客戶端B只是創建一個Socket,它將嘗試連接到9998端口,這是我用ServerSocket監聽的端口,然後將它傳遞給它的線程。事情是,當我啓動我的客戶端(A然後B),並且我在控制檯A中寫入時,控制檯B上沒有任何事情發生(也許我應該早些指定,對不起)。
我猜想這是由於我的套接字使用的端口。我查了一些教程,即使在閱讀你的迴應後,我也沒有看到有什麼問題,所以要麼我錯過了一些非常明顯的概念,要麼不是連接本身,而是我處理連接的方式。爲以防萬一,我會發表帖子的內容:
public class TWritingSock extends Thread {
private Socket sockw;
public TWritingSock(Socket sockw){
this.sockw = sockw;
}
@Override
public void run(){
try {
while(true){
//Recuperation des saisies clavier
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//Ecriture de la saisie
PrintWriter pw= new PrintWriter(sockw.getOutputStream(), true);
String typed = br.readLine();
if(typed.equals("fin")){
//sockw.close();
System.out.println("fermé");
break;
}
pw.write(typed);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
sockw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
而且
public class TReadingSock extends Thread {
private Socket sockr;
public TReadingSock(Socket sockr){
this.sockr = sockr;
}
@Override
public void run(){
try {
while(true){
BufferedReader br = new BufferedReader(new InputStreamReader(sockr.getInputStream()));
String typed = br.readLine();
if(typed.equals("fin")){
//sockr.close();
System.out.println("fermé");
break;
}
System.out.println(typed);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
sockr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
你會更好地閱讀套接字教程。 – jtahlborn
是的閱讀教程,它並不是那麼糟糕。 – Siddharth