【求助】Socket编程,程序第二次运行至server.accept()异常停止。

一支牙膏呀 2019-01-23 07:28:13
目前正学习Socket编程。写了个简单的客户端和服务器通信的程序,为了保持服务器运行,使用了while(true){},循环第二次运行至以下语句程序无法往下进行。调试发现是accept方法的某条语句执行不了,具体见调试的动图。这个问题调试、搜素百度都没有一点头绪。搞了3、4个小时了,麻烦各位大大解答一番。感激不尽。

Socket client = server.accept();


代码中代码很简单,如下:
客户端代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TestClient2 {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建Socket对象
Socket client = new Socket("localhost",9998);
DataOutputStream dos;
DataInputStream dis;
Scanner input = new Scanner(System.in);
while(true) {
//获取输出流
dos = new DataOutputStream(client.getOutputStream());
String str = input.next();
dos.writeUTF(str);
//获取输入流
dis = new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
}

}
}

服务器端代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {
public static void main(String[] args) throws IOException {
System.out.println("-------------服务器已启动---------------------");
ServerSocket server = new ServerSocket(9998);
DataInputStream dis;
DataOutputStream dos;

while(true) {
Socket client = server.accept();
dis = new DataInputStream(client.getInputStream());
String str = dis.readUTF();
System.out.println("客户端发动的数据为:"+str);
dos= new DataOutputStream(client.getOutputStream());
dos.writeUTF("服务器收到你的:"+str);
}
}
}

调试动图


动图显示不出来,只能截图了。
图片显示的语句就是从accept方法进入,一路运行,程序最终该图中所示语句出停止。既没有报错,连调试的小箭头也消失了。


再次谢过。。。
...全文
435 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
一支牙膏呀 2019-12-05
  • 打赏
  • 举报
回复
多谢各位的指点。后来问题解决了,我都忘了感谢各位了。
咫尺天涯$ 2019-02-14
  • 打赏
  • 举报
回复
很简单啊,你的客户端由始至终都只用了一个 socket,服务器第一次 accept 之后获得了一个和此 socket 通信的 socket,当服务器第二次来到 accept 的时候之前的那个 socket 已经被丢弃了,accept 在等待第二个连接事件的到来以产生一个新的 socket。然而你的客户端此时正在使用自己的那个无效的 socket(服务器与之关联的 socket 已经丢弃), write 之后处于 read 的等待中
快乐先生 2019-02-12
  • 打赏
  • 举报
回复
在server端接收到请求后,开启一个线程来处理。
zoeg 2019-01-29
  • 打赏
  • 举报
回复
很不错,很有学习的劲头!

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

public class SocketDemo {
	public static void main(String... args) throws IOException {
		final Socket socket = new Socket("localhost", 8043);
		new Thread() {
			public void run() {
				try {
					InputStream is = socket.getInputStream();
					pipe(is,System.out);
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					try {
						socket.close();
					} catch (IOException e) {
					}
				}
			}
		}.start();
		new Thread() {
			public void run() {
				try {
					OutputStream os = socket.getOutputStream();
					PrintStream out = new PrintStream(os);
					pipe(System.in, out);
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					try {
						socket.close();
					} catch (IOException e) {
					}
				}
			}
		}.start();
	}

	public static void pipe(InputStream is, PrintStream out) throws IOException {
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String line;
		while ((line = br.readLine()) != null)
			out.println(line);
		out.flush();
	}
}

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketDemo {
	public static void main(String... args) throws IOException {
		ServerSocket server = new ServerSocket(8043);
		while (true) {
			final Socket accept = server.accept();
			new Thread() {
				public void run() {
					try {
						InputStream is = accept.getInputStream();
						SocketDemo.pipe(is, System.out);
						is.close();
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							accept.close();
						} catch (IOException e) {
						}
					}
				}
			}.start();
			new Thread() {
				public void run() {
					try {
						OutputStream os = accept.getOutputStream();
						PrintStream out = new PrintStream(os);
						SocketDemo.pipe(System.in, out);
						out.close();
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							accept.close();
						} catch (IOException e) {
						}
					}
				}
			}.start();
		}
	}
}
qq_39936465 2019-01-24
  • 打赏
  • 举报
回复
可能是重复申明问题,改下面试试

Socket client= null;
while(true){
client = server.accept();
MyChannel my=new MyChannel(client);
new Thread(my).start();
}
ty19940419 2019-01-24
  • 打赏
  • 举报
回复
Socket client = server.accept();
放在循环外
qq_39936465 2019-01-24
  • 打赏
  • 举报
回复
引用 楼主 一支牙膏呀 的回复:
目前正学习Socket编程。写了个简单的客户端和服务器通信的程序,为了保持服务器运行,使用了while(true){},循环第二次运行至以下语句程序无法往下进行。调试发现是accept方法的某条语句执行不了,具体见调试的动图。这个问题调试、搜素百度都没有一点头绪。搞了3、4个小时了,麻烦各位大大解答一番。感激不尽。

Socket client = server.accept();


代码中代码很简单,如下:
客户端代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TestClient2 {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建Socket对象
Socket client = new Socket("localhost",9998);
DataOutputStream dos;
DataInputStream dis;
Scanner input = new Scanner(System.in);
while(true) {
//获取输出流
dos = new DataOutputStream(client.getOutputStream());
String str = input.next();
dos.writeUTF(str);
//获取输入流
dis = new DataInputStream(client.getInputStream());
System.out.println(dis.readUTF());
}

}
}

服务器端代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server2 {
public static void main(String[] args) throws IOException {
System.out.println("-------------服务器已启动---------------------");
ServerSocket server = new ServerSocket(9998);
DataInputStream dis;
DataOutputStream dos;

while(true) {
Socket client = server.accept();
dis = new DataInputStream(client.getInputStream());
String str = dis.readUTF();
System.out.println("客户端发动的数据为:"+str);
dos= new DataOutputStream(client.getOutputStream());
dos.writeUTF("服务器收到你的:"+str);
}
}
}

调试动图


动图显示不出来,只能截图了。
图片显示的语句就是从accept方法进入,一路运行,程序最终该图中所示语句出停止。既没有报错,连调试的小箭头也消失了。


再次谢过。。。



你客户端把输入输出写进循环想干么?一个用户执行一次就够了,把输入输出写入循环变成模拟多用户连接了。如果想模拟多用户连接,你服务器端要写成多线程方式,一个新用户对应一个新线程,还要记得设置结束标志,不然不就是死循环了么?
一支牙膏呀 2019-01-23
  • 打赏
  • 举报
回复
二楼说的对。程序第二次运行至server.accept()停下,是因为它在监听是否有客户端连接,程序本身并没有中止。
loveljy_19901114 2019-01-23
  • 打赏
  • 举报
回复
建议你在网上找一个socket教程看一下,你这个流啊socket啊都没关,怎么可能第二次接收

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧