客户端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();
}
}服务端codepublic 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();
}
}
但现在服务端确只接受一次请求了,不知道为什么
socketjava
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();
}
}服务端codepublic 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();
}
}
但现在服务端确只接受一次请求了,不知道为什么
socketjava
解决方案 »
- 通过Struts2 实现文件上传乱码问题,紧急求助!!!
- hibernate的辅助类HibernateSessionFactory应该放在什么目录下。
- myeclipse9.0 for linux下载
- 为什么不能级联添加 报奇怪异常
- 时间转换问题,请求帮助
- 关于struts中的标签logic:iterate
- jTabbedPane为什么显示不出来?
- 急:JDBC Statement 批量查询的问题
- 200分~求webwork中文资料及相关资料~谢了先
- 送一百分(新手问题2)
- xmlrpc和动态代理结合的问题
- MyEclipse10+axis2 生成客户端代码,运行时出现Wrong number of arguments!
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();
}
}
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();
}
}
服务端:
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();
}
}结果:
这次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());难道我这样写有问题吗?一直没想通
看一下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……
请楼主再仔细考虑一下,然后再看我在6楼的回复。我觉得已经说得够详细了。