Java服务器和客户端套接字需要修复

时间:2012-09-24 16:06:25

标签: java sockets

您好,我是java socket编程的新手,我只是想看看是否有人能给我一些帮助。

我将发布客户端和服务器的代码,然后我将解释我的问题......

            reader = new BufferedReader(new InputStreamReader(socket.getInputStream));

        while(running)
        {
            String line = reader.readLine();

            if(line != null)
            {
                System.out.println(line);
                stream = new PrintStream(socket.getOutputStream());
                stream.println("return: " + line);
            }

        }

    }catch(IOException e)
    {
        System.out.println("Socket in use or not available: " + port);
    }
}

public static void main()
{
    run();
}


//Client

public static String ip;
public static int port;

public static Socket socket;
public static PrintStream stream;
public static BufferedReader reader;

public static void main(String args[])
{

    try
    {
        socket = new socket(ip, port);
        stream = new PrintStream(socket.getOutputStream());
        stream.println("test0");
        reader = new BufferedReader(new  InputStreamReader(socket.getInputStream));
        String line = reader.readLine();

        if(line != null)
        {
            System.out.println(line);
        }   

        stream.println("test1");
        line = reader.readLine();

        if(line != null)
        {
            System.out.println(line);   
        }   
    }catch(IOException e)
    {
            System.out.println("could not connect to server!");
    }
}

所以我的问题是即使我摆脱了循环并试图让它发送两次字符串它也不会发送它。它只会执行一次,除非我关闭并在客户端创建一个新的套接字。所以如果有人能给我解释我做错了什么就会很好,非常感谢你。

3 个答案:

答案 0 :(得分:1)

为什么要在循环中打开你的游戏? stream = new PrintStream(socket.getOutputStream());

在循环外部使用此语句并写入循环内的stream

答案 1 :(得分:0)

请保持简单,

尝试使用InputStream, InputStreamReader, BufferedReader, OutputStream, PrintWriter.

客户端:

Socket s = new Socket();
s.connect(new InetSocketAddress("Server_IP",Port_no),TimeOut); 
// Let Timeout be 5000

服务器端:

ServerSocket ss = new ServerSocket(Port_no);
Socket incoming = ss.accept();

从套接字中读取:

InputStream is = s.getInputStream();
InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);
boolean isDone = false;

String s = new String();

while(!isDone && ((s=br.readLine())!=null)){

     System.out.println(s);   // Printing on Console

 }

写入套接字:

OutputStream os = s.getOuptStream();
PrintWriter pw = new PrintWriter(os)

pw.println("Hello");

答案 2 :(得分:0)

非常感谢所有回答过的人,但我一直在弄清楚它到底是什么。 我读了一些Oracle套接字的东西,并发现服务器应该是第一个发送消息而不是客户端接收和发送和接收...等等所以我将在这里发布我的新代码希望有人试图找出同样的东西可以轻松找到它

    //Client    
public static String ip;
public static int port;

public static Socket socket;
public static PrintWriter print;
public static BufferedReader reader;

public Client(String ip, int port)
{
    this.ip = ip;
    this.port = port;

            //initiate all of objects
    try 
    {
        socket = new Socket();
        socket.connect(new InetSocketAddress(ip, port), 5000);
        print = new PrintWriter(socket.getOutputStream());
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //start connection with server
        String line = reader.readLine();
        System.out.println(line);
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
}

    //quick method to send message
public void sendMessage(String text)
{
    print.println(text);
    print.flush();
    try 
    {
        String line = reader.readLine();
        System.out.println(line);
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
}
}

public static void main(String args[])
{
    client.sendMessage("test");
    client.sendMessage("test2");
    client.sendMessage("test3")
}

    //Server


public static int port = 9884;
public static boolean running = true;

public static ServerSocket serverSocket;
public static Socket socket;
public static PrintWriter writer;
public static BufferedReader reader;

public static void run()
{
    try 
    {
        serverSocket = new ServerSocket(port);
        socket = serverSocket.accept();
        writer = new PrintWriter(socket.getOutputStream(), true);
        writer.println("connection");

        while(running)
        {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = reader.readLine();

            if(line != null)
            {
                System.out.println(line);
                writer.println(line);
                writer.flush();
            }
        }
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
}

public static void main(String args[])
{
    run();
}