我首先使用线程和套接字,所以我正在尝试进行聊天(本地)
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();
}
}
打印显示:
客户甲:
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 对象,我将其传递给我的线程,以便它们可以完成工作。那是给客户A的。客户端 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();
}
}
}
}