gpt4 book ai didi

java - Java套接字的端口问题

转载 作者:行者123 更新时间:2023-11-29 05:43:11 25 4
gpt4 key购买 nike

我第一次使用线程和套接字,所以我尝试进行聊天(本地)

ClientA(其实是服务器):

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

客户乙:

socket listening on local port : 50875  
socket listening on port : 9998

所以,尽管看起来很愚蠢,但我在理解整个套接字的事情时遇到了严重的问题,我得到的唯一结果是我的程序正在监听不同的端口,但我不明白为什么。我想这对某些人来说一定很明显,所以我请求你的帮助来启发我!

提前致谢。

编辑:感谢您的所有回答。问题是,对我来说,您需要一个 ServerSocket 来监听端口并接受任何尝试连接的客户端。当它完成时,它返回一个 Socket 对象,我将它传递给我的线程,这样它们就可以完成它们的工作。那是给 ClientA 的。客户端 B 只是创建一个套接字,它将尝试连接到 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();
}
}
}
}

最佳答案

(我将使用粗略和简单的图像来谈论 Socket,请将其视为我试图尽可能简单地解释这一点。)

将套接字视为隧道。现在,如果我告诉你我的隧道尽头是 9998,你就可以到达它,但你的隧道尽头可以是任何东西,由你决定。

ClientA(实际上是服务器)说“我想在端口 9998 上监听”。当 ClientA 连接时“好的,我们连接上了,我在端口 9998 而你在 50875。”。

ClientB 说“我想访问你的端口 9998,我将使用我的端口 50875 这样做。”

两个应用程序现在都可以通过隧道进行通信,因为它们知道隧道的去向。

关于java - Java套接字的端口问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com