我有一个关于java网络通信的问题

我先大概说一下,就是我这个程序有客户和服务器两部分,但是我只能实现客户向服务器的一次对话,服务器可以接收到来自客户的信息,但是以后客户说话或者服务器说话对方都不能接受到请问这是什么问题呀程序在下面希望大神们帮我看看,这对于一个初学者来说真的很重要!
客户端程序:
import java.awt.Color;
import java.awt.Container;
import java.io.*;
import java.net.*;

import javax.swing.*;

public class MyClient extends JFrame
{
public static void main (String args[])
{
JFrame jf=new JFrame("这是用户");
Container container=jf.getContentPane();
jf.setVisible(true); //设置窗体为可视
jf.setLayout(null); //窗体布局为网格
jf.setSize(600,500);
jf.setBackground(Color.BLUE);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JTextArea a=new JTextArea("",2,10);
container.add(a);
a.setBounds(10, 10, 100, 100);
try
{
Socket socket = new Socket("127.0.0.1",2017);
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader (socket.getInputStream()));
BufferedReader sin = new BufferedReader(new InputStreamReader (System.in));
String s,str;
do
{
s=sin.readLine();
out.println(s);
out.flush();//输出
a.setText("me: "+s);
str=in.readLine();
a.setText("he: "+str);

        }while(str!="bye");
        out.close();
        in.close();
        socket.close();
    }
    catch(Exception e)
    {}
}

}

服务器端程序:
import java.awt.Color;
import java.awt.Container;
import java.io.*;
import java.net.*;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import javax.swing.*;
public class MyServer extends JFrame
{

public static void main (String args[]){
    JFrame jf=new JFrame("这是服务器");
    Container container=jf.getContentPane();
    jf.setVisible(true);   //设置窗体为可视
    jf.setLayout(null);  //窗体布局为网格
    jf.setSize(600,500);
    jf.setBackground(Color.BLUE);
    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    JTextArea a=new JTextArea("",2,10);
    container.add(a);
    a.setBounds(10, 10, 100, 100);
    try
    {
        ServerSocket server = new ServerSocket(2017);
        Socket socket=server.accept();


        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        BufferedReader sin=new BufferedReader(new  InputStreamReader(System.in));


        String s,str;

        do
        {
            s=in.readLine();
            a.setText("he:  "+s);
            str=sin.readLine();
            out.println(str);
            out.flush();
            a.setText("me:  "+str);
        }while(s!="bye");
        {
            in.close();
            out.close();
            socket.close();
            server.close();
        }




    }catch(Exception e){
        System.out.println("Error:"+e);
    }
}

}
蛮烦大家了!非常感谢

while(true) {Socket socket=server.accept();
……
}
加一个循环就好了
Socket socket=server.accept();
这个方法是堵塞的,只有客户端请求的时候才往下执行

为啥都没有监听操作就能实现socket通信呢?

服务器得循环监听着,,,,,,

  1. 我写过一篇 这是服务器的源代码 没发UI import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class Server {

BufferedReader br=null;
PrintStream ps=null;
JTextArea showMsgField=null;
public Server(JTextArea showMsgField)
{
this.showMsgField=showMsgField;
initServer();//监听端口
getMsg(); //开心线程 接收信息
}
public void initServer()
{
try {
//服务器监听端口
ServerSocket serverSocket=new ServerSocket(1025);
//服务器监听用户进入,否者等待 返回socket类型
Socket socket=serverSocket.accept();
//接收进来的二进制数据

InputStream is=socket.getInputStream();
//转成文本流
br=new BufferedReader(new InputStreamReader(is));

//向网络上发送消息
ps=new PrintStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "端口被占用");
}
}
//向网络上发送消息

public void sendMsgToClient(String msg)
{
ps.println(msg);
showMsgField.append("三毛:"+msg+"\n");
}
//开启新线程 读取信号
public void getMsg()
{
new Thread(new Runnable(){

public void run() {

while(true)
{
try {
String msg=br.readLine();
//把获得的字符串追加大显示文本框中
showMsgField.append("张永超:"+msg+"\n");
} catch (IOException e) {
e.printStackTrace();
}

}
}

}).start();
}
}

  1. 我写过一篇 这是服务器的源代码 没发UI import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class Server {

BufferedReader br=null;
PrintStream ps=null;
JTextArea showMsgField=null;
public Server(JTextArea showMsgField)
{
this.showMsgField=showMsgField;
initServer();//监听端口
getMsg(); //开心线程 接收信息
}
public void initServer()
{
try {
//服务器监听端口
ServerSocket serverSocket=new ServerSocket(1025);
//服务器监听用户进入,否者等待 返回socket类型
Socket socket=serverSocket.accept();
//接收进来的二进制数据

InputStream is=socket.getInputStream();
//转成文本流
br=new BufferedReader(new InputStreamReader(is));

//向网络上发送消息
ps=new PrintStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "端口被占用");
}
}
//向网络上发送消息

public void sendMsgToClient(String msg)
{
ps.println(msg);
showMsgField.append("三毛:"+msg+"\n");
}
//开启新线程 读取信号
public void getMsg()
{
new Thread(new Runnable(){

public void run() {

while(true)
{
try {
String msg=br.readLine();
//把获得的字符串追加大显示文本框中
showMsgField.append("张永超:"+msg+"\n");
} catch (IOException e) {
e.printStackTrace();
}

}
}

}).start();
}
}

可以写一个死循环,,循环接听客户端的请求,,就可以一直接收了,,或者弄个线程接受

测试了你的代码,发现你的代码客户端和服务器端的两个while循环都无法正常结束啊。是不是用do while有问题呢?