日期:2014-05-20  浏览次数:20838 次

求助,关于java socket数据发送的问题?
Socket socket = new Socket("192.168.137.1",9000);//tcp连接,这是客户端
OutputStream outputStream = socket.getOutputStream();

先把服务器和客户端建立tcp连接,首先服务器端向客户端发送消息。客户端再把接收到的消息发送给服务器端。


程序要求的要求:刚开始的时候,客户端不向服务器发送数据,但是tcp连接已经建立,如何实现客户端接收到了服务器的数据,可以通过原有的socket再发送给tcp(之前该socket没有数据发送,此时接收到了数据)

先谢谢了!

------解决方案--------------------
因为socket的Stream是阻塞的,InputStream和OutputStream是不能同时一起工作的,所以从设计的角度不建议将输入和输出放在同一个Socket上实现(特别是长连接),而是用不同的Socket来分别实现。
如果你一定要用同一个Socket来实现的话,方法是有,不过要付出代价。如服务端先是通过OutputStream输出数据,再通过InputStream获取数据,那么在输出数据后要调用socket.shutdownOutput()关闭输出流(同时客户端的InputStream也会关闭),才可以使用InputStream获取数据。但是关闭掉的流就不能再用了(这就是代价),所以它只支持你一个来回的操作。如果你是要一直交互的,那么用这种方式是行不通的。

------解决方案--------------------
Java code

public class Client {
    private final Socket receiver;
    private final Socket sender;
    
    public Client() {
        receiver = ...;
        sender = ...;
    }
    
    public void receive() {
        while (true) {
            接收...
            send(msg);
        }
    }
    
    public void send(String msg) {
        ...
    }
}

------解决方案--------------------
写了个简单的例子,你试看看能用不,
只是简单的把客户端控制台输出发送在服务器,
服务器把内容打印出来,返回一个字符串给客户端,
并且每5秒钟向所有客户端广播一次系统时间
HTML code
"java"
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class TServerSocket {
    public static void main(String[] args){
        final List<SocketProcessor> socketList = new ArrayList<SocketProcessor>();
        try {
            ServerSocket serverSocket = new ServerSocket(12345);
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println("broadcast");
                    for(SocketProcessor processor : socketList)
                        processor.writeToString(Calendar.getInstance().getTime().toGMTString());
                }
            }, 100, 5000);
            while(true){
                Socket socket = serverSocket.accept();
                SocketProcessor processor = new SocketProcessor(socket);
                new Thread(processor).start();
                socketList.add(processor);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class SocketProcessor implements Runnable{
    private Socket socket;
    private InputStream in = null;
    private OutputStream out = null;
    
    public SocketProcessor(Socket socket){
        this.socket = socket;
        try {
            in = socket.getInputStream();
            out = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void writeToString(String info){
        try {
            out.write(info.getBytes());
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void run() {
        byte[] data = new byte[1024];
        while(true){
            try {
                int length = in.read(data);
                System.out.println(new String(data, 0, length));
                out.write("recived".getBytes());
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
}