socket客户端往服务端发送数据异常

javaliuliu 2013-10-13 11:18:19
客户端code


public class Client implements Runnable{

private static Socket s;

private Socket getInstance(){
if(s==null){
try {
return s=new Socket("127.0.0.1",8000);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return s;
}

public void sendMsg() {
while(true){
try {
run();
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

@Override
public void run() {
System.out.println("come into run");
try {
Socket c = getInstance();
OutputStream ops =c.getOutputStream();
ops.write(new byte[]{0000});
ops.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}

public static void main(String[] args) {
Client c = new Client();
c.sendMsg();
}
}



服务端code

public class Server {

private ServerSocket serverSocket;

public Server(){
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(8000));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("服务启动");
}

public void service() {
while (true) {
Socket s = null;
try {
s = serverSocket.accept();
System.out.println("come a new request~ "+s.getInetAddress()+":"+s.getPort());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(s!=null)
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Server server = new Server();
server.service();
}
}



我的想法是每隔3秒往服务端发送一个数据包,现在的情况是会抛异常:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at com.ls.test.Client.run(Client.java:44)
at com.ls.test.Client.sendMsg(Client.java:28)
at com.ls.test.Client.main(Client.java:57)

我发现可能是server端把socket close的原因所以去掉了关闭代码:
finally {
if(s!=null)
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
但现在服务端确只接受一次请求了,不知道为什么
...全文
366 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
javaliuliu 2013-10-29
  • 打赏
  • 举报
回复
我懂了,谢谢,我把监听写到while里了,每次请求都会重复监听,一直阻塞了。tks
rockets311 2013-10-15
  • 打赏
  • 举报
回复
serverSocket.accept();//这一行会被阻塞
看一下accept的介绍,注意红色部分: Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made. 它说这个方法在新的连接到来之前会一直被阻塞。 而在客户端你写的方法:
private Socket getInstance(){}
这个方法保证了只会建立一次连接。 也就是说客户端在第一次连接建立之后没有新的连接了,而服务端的死循环里接收到第一次连接并打印之后马上又去傻傻的等待第二次连接了,它肯定是等不到的,So……
rockets311 2013-10-15
  • 打赏
  • 举报
回复
引用 7 楼 javaliuliu 的回复:
[quote=引用 6 楼 duxingzhe0311 的回复:]
serverSocket.accept();//这一行会被阻塞
看一下accept的介绍,注意红色部分: Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made. 它说这个方法在新的连接到来之前会一直被阻塞。 而在客户端你写的方法:
private Socket getInstance(){}
这个方法保证了只会建立一次连接。 也就是说客户端在第一次连接建立之后没有新的连接了,而服务端的死循环里接收到第一次连接并打印之后马上又去傻傻的等待第二次连接了,它肯定是等不到的,So……
是的,我的客户端需求只要求建立一个socket连接。所以用了单例模式,但服务端我的问题出在哪呀?感觉写法差不多,为什么你的能一直监听到消息,我的只能接受一次[/quote] 请楼主再仔细考虑一下,然后再看我在6楼的回复。我觉得已经说得够详细了。
javaliuliu 2013-10-15
  • 打赏
  • 举报
回复
引用 6 楼 duxingzhe0311 的回复:
serverSocket.accept();//这一行会被阻塞
看一下accept的介绍,注意红色部分: Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made. 它说这个方法在新的连接到来之前会一直被阻塞。 而在客户端你写的方法:
private Socket getInstance(){}
这个方法保证了只会建立一次连接。 也就是说客户端在第一次连接建立之后没有新的连接了,而服务端的死循环里接收到第一次连接并打印之后马上又去傻傻的等待第二次连接了,它肯定是等不到的,So……
是的,我的客户端需求只要求建立一个socket连接。所以用了单例模式,但服务端我的问题出在哪呀?感觉写法差不多,为什么你的能一直监听到消息,我的只能接受一次
rockets311 2013-10-14
  • 打赏
  • 举报
回复
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client implements Runnable
{
	private static Socket s;

	private Socket getInstance()
	{
		if (s == null)
		{
			try
			{
				return s = new Socket("127.0.0.1", 8000);
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return s;
	}

	@Override
	public void run()
	{
		while (true)
		{
			try
			{
				System.out.println("come into run");
				Socket c = getInstance();
				OutputStream ops = c.getOutputStream();
				ops.write(new byte[]
				{
					0000
				});
				ops.flush();
				Thread.sleep(3000);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args)
	{
		Client c = new Client();
		new Thread(c).start();
	}
}
javaliuliu 2013-10-14
  • 打赏
  • 举报
回复
引用 3 楼 duxingzhe0311 的回复:
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable
{
	private ServerSocket serverSocket;

	private Socket s;
	
	public Server()
	{
		try
		{
			serverSocket = new ServerSocket();
			serverSocket.bind(new InetSocketAddress(8000));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		System.out.println("服务启动");
	}

	public void run()
	{
		while (true)
		{
			try
			{
				if(null == s)
					s = serverSocket.accept();
				InputStream is = s.getInputStream();
				DataInputStream dis = new DataInputStream(is);
				String str = null;
				while(null != (str = dis.readUTF()))
				{
					System.out.println("come a new request~ " + s.getInetAddress()
							+ ":" + s.getPort() + str);
				}
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args)
	{
		Server server = new Server();
		new Thread(server).start();
	}
}
这次ok了。非常感谢~ 我对比了我们之间的代码,发现区别在server端的接收上你的代码是:

InputStream is = s.getInputStream();
                BufferedReader buf = new BufferedReader(new InputStreamReader(is));
                String str = null;
                while(null != (str = buf.readLine()))
                {
                    System.out.println("come a new request~ " + s.getInetAddress()
                            + ":" + s.getPort() + str +  new SimpleDateFormat("mm:ss").format(new Date()));
                }
而我是这样写的:

 s = serverSocket.accept();
                System.out.println("come a new request~ "+s.getInetAddress()+":"+s.getPort());
难道我这样写有问题吗?一直没想通
rockets311 2013-10-14
  • 打赏
  • 举报
回复
仔细测了一下:
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Server implements Runnable
{
private ServerSocket serverSocket;

private Socket s;

public Server()
{
try
{
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(8000));
s = serverSocket.accept();
}
catch (IOException e)
{
e.printStackTrace();
}
System.out.println("服务启动");
}

public void run()
{
while (true)
{
try
{
InputStream is = s.getInputStream();
BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String str = null;
while(null != (str = buf.readLine()))
{
System.out.println("come a new request~ " + s.getInetAddress()
+ ":" + s.getPort() + str + new SimpleDateFormat("mm:ss").format(new Date()));
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
Server server = new Server();
new Thread(server).start();
}
}

客户端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Client implements Runnable
{
private static Socket s;

private Socket getInstance()
{
if (s == null)
{
System.out.println("nullllllllllll");
try
{
return s = new Socket("127.0.0.1", 8000);
}
catch (IOException e)
{
e.printStackTrace();
}
}
return s;
}

public void run()
{
while (true)
{
try
{
String d = new SimpleDateFormat("mm:ss").format(new Date()) + System.getProperty("line.separator");
System.out.println("come into run" + d);
Socket c = getInstance();
OutputStream ops = c.getOutputStream();
ops.write(d.getBytes());
ops.flush();
Thread.sleep(3000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

public static void main(String[] args)
{
Client c = new Client();
new Thread(c).start();
}
}

结果:
rockets311 2013-10-14
  • 打赏
  • 举报
回复
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable
{
	private ServerSocket serverSocket;

	private Socket s;
	
	public Server()
	{
		try
		{
			serverSocket = new ServerSocket();
			serverSocket.bind(new InetSocketAddress(8000));
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		System.out.println("服务启动");
	}

	public void run()
	{
		while (true)
		{
			try
			{
				if(null == s)
					s = serverSocket.accept();
				InputStream is = s.getInputStream();
				DataInputStream dis = new DataInputStream(is);
				String str = null;
				while(null != (str = dis.readUTF()))
				{
					System.out.println("come a new request~ " + s.getInetAddress()
							+ ":" + s.getPort() + str);
				}
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args)
	{
		Server server = new Server();
		new Thread(server).start();
	}
}
javaliuliu 2013-10-14
  • 打赏
  • 举报
回复
引用 1 楼 duxingzhe0311 的回复:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client implements Runnable
{
	private static Socket s;

	private Socket getInstance()
	{
		if (s == null)
		{
			try
			{
				return s = new Socket("127.0.0.1", 8000);
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		return s;
	}

	@Override
	public void run()
	{
		while (true)
		{
			try
			{
				System.out.println("come into run");
				Socket c = getInstance();
				OutputStream ops = c.getOutputStream();
				ops.write(new byte[]
				{
					0000
				});
				ops.flush();
				Thread.sleep(3000);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args)
	{
		Client c = new Client();
		new Thread(c).start();
	}
}
我用了你的代码,在服务端只会接收一次请求,不知道为什么

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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