java 网络编程程序问题,服务端关闭异常
/*客户端:需求:给服务端发送给一个文本数据。步骤:1,建立socket服务。指定要连接主机和端口。2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务...
/*
客户端:
需求:给服务端发送给一个文本数据。
步骤:
1,建立socket服务。指定要连接主机和端口。
2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
4,关闭客户端资源。
*/
import java.net.*;
import java.io.*;
class TcpClient{
public static void main(String[] args)throws Exception{
//创建客户端的socket服务,指定主机和端口
Socket s = new Socket("192.168.1.100",10007);
//为了发送数据,应该获取Socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp data lai le".getBytes());
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
byte[] buf = line.getBytes();
out.write(buf,0,buf.length);
if("886".equals(line))
break;
}
}
catch (Exception e)
{
throw new RuntimeException("发送端失败");
}
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上。
服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。
4,关闭服务端。(可选)
*/
import java.net.*;
import java.io.*;
class TcpServer{
public static void main(String[] args)throws Exception{
//建立服务端Socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10007);
while(true){
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
boolean mark = true;
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
if(str.equals("886")){
ss.close();
break;
}
System.out.println(str);
}
s.close();//关闭客户端
}
}
}
E:\JavaPractice\tcptest>java TcpServer
192.168.1.100.....connected
tcp data lai le
kjdkfja
dlkfjlaskj
Exception in thread "main" java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:426)
at TcpServer.main(TcpServer.java:24) 展开
客户端:
需求:给服务端发送给一个文本数据。
步骤:
1,建立socket服务。指定要连接主机和端口。
2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
4,关闭客户端资源。
*/
import java.net.*;
import java.io.*;
class TcpClient{
public static void main(String[] args)throws Exception{
//创建客户端的socket服务,指定主机和端口
Socket s = new Socket("192.168.1.100",10007);
//为了发送数据,应该获取Socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp data lai le".getBytes());
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
byte[] buf = line.getBytes();
out.write(buf,0,buf.length);
if("886".equals(line))
break;
}
}
catch (Exception e)
{
throw new RuntimeException("发送端失败");
}
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上。
服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。
4,关闭服务端。(可选)
*/
import java.net.*;
import java.io.*;
class TcpServer{
public static void main(String[] args)throws Exception{
//建立服务端Socket服务,并监听一个端口
ServerSocket ss = new ServerSocket(10007);
while(true){
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
boolean mark = true;
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
if(str.equals("886")){
ss.close();
break;
}
System.out.println(str);
}
s.close();//关闭客户端
}
}
}
E:\JavaPractice\tcptest>java TcpServer
192.168.1.100.....connected
tcp data lai le
kjdkfja
dlkfjlaskj
Exception in thread "main" java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:426)
at TcpServer.main(TcpServer.java:24) 展开
展开全部
晕,又是你,
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
if(str.equals("886")){
ss.close();
break;
}
System.out.println(str);
}
s.close();//关闭客户端
System.out.println(str);
}
s.close();//关闭客户端
继续改造 ,
if(str.equals("886")){
ss.close();
break;
}
我怀疑是服务端关了的原因,你反 ss.close() 删掉试试。
好像说错了,先关闭客户端,再关闭服务端。
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
while(mark){
int len = in.read(buf);
String str = new String(buf,0,len);
if(str.equals("886")){
ss.close();
break;
}
System.out.println(str);
}
s.close();//关闭客户端
System.out.println(str);
}
s.close();//关闭客户端
继续改造 ,
if(str.equals("886")){
ss.close();
break;
}
我怀疑是服务端关了的原因,你反 ss.close() 删掉试试。
好像说错了,先关闭客户端,再关闭服务端。
更多追问追答
追问
我就是想关闭服务端啊,删了当然可以了。不知如何修改才可以正常关闭服务端
追答
先关客户端,再关服务端,应该把所有的客户端关了,再关服务端。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询