java socket 一对一聊天_[求助]一个关于JAVA Socket一对一聊天工具

本文探讨了一个Java Socket实现的一对一聊天工具中,客户端与服务器端消息传递的不对称问题。通过分析代码,发现问题是服务器端在`connectRecive()`方法中总是等待客户端连接,而客户端的连接请求并未保存。正确的做法是保存客户端连接并异步处理消息。
摘要由CSDN通过智能技术生成

[求助]一个关于JAVA Socket一对一聊天工具

大家看看]

这是一个关于JAVA Socket一对一聊天工具:

分客户端和服务器端:

客户端可以发消息到服务器端

但是反过来不可以

如果我把下面程序中标有/**AAAAAAAAA***/ 和标有/**CCCCCCCCCCCCC**/

它们互换注释 情况又是相反的结果??

有点奇怪

高手看看 错在哪......

小第先谢谢了...

服务器端

package GG工程;

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class Server extends JFrame

{

private JTextArea jTextArea;

private JTextField jTextField;

InputStream inputStream;

OutputStream outputStream;

static ServerSocket serverSocket;

Socket socket;

public Server()

{

窗体///

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jFrame=new JFrame("GG服务器端");//新建窗体

jFrame.setBounds(200, 200, 320, 300);

jFrame.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent we)

{

System.exit(0);

}

});

/文本域//

jTextArea=new JTextArea();//新建文本域

jTextArea.setEditable(false);//设置不可编辑属性

JScrollPane jScrollPane=new JScrollPane(jTextArea);

jFrame.getContentPane().add(jScrollPane,"Center");//添加到窗体

//面版和按钮属性事件//

JPanel jPanel_1=new JPanel();

JLabel jLabel=new JLabel("请输入消息");

jTextField=new JTextField(20);

jPanel_1.add(jLabel);

jPanel_1.add(jTextField);

JPanel jPanel_2=new JPanel();

JButton jButton_1=new JButton("发送");

jButton_1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

jTextArea.append("\n你说:"+jTextField.getText());

connetcSend();

jTextField.setText("");

}

});

JButton jButton_2=new JButton("取消");

jButton_2.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

jTextField.setText("");

}

});

JButton jButton_3=new JButton("退出");

jButton_3.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

System.exit(0);

}

});

jPanel_2.add(jButton_1);

jPanel_2.add(jButton_2);

jPanel_2.add(jButton_3);

JPanel jPanel_12=new JPanel(new GridLayout(2,1));

jPanel_12.add(jPanel_1);

jPanel_12.add(jPanel_2);

jFrame.getContentPane().add(jPanel_12,"South");

jFrame.show();

}

public void connectRecive()

{

try

{

String str;

socket=serverSocket.accept();

while(true)

{

inputStream=socket.getInputStream();

BufferedInputStream bufferInput=new BufferedInputStream(inputStream);

byte[] bty=new byte[100];

int len=bufferInput.read(bty);

str=new String(bty,0,len);

jTextArea.append("对方说:"+str+"\n");

if(str.equals("exit"))

break;

}

inputStream.close();

socket.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

public void connetcSend()

{

try

{

socket=serverSocket.accept(); /**AAAAAAAAAAAAAAAAAAAAA**/

outputStream=socket.getOutputStream();

BufferedOutputStream bufferOutput=new BufferedOutputStream(outputStream);

bufferOutput.write(jTextField.getText().getBytes());

bufferOutput.flush();

}

catch(Exception e)

{

e.printStackTrace();

}

}

public static void main(String [] args) throws Exception

{

serverSocket=new ServerSocket(6007);

Server server=new Server();

//socket=serverSocket.accept(); /**CCCCCCCCCCCCCCCCCCCCCC**/

server.connectRecive();

}

}

/客户端

package GG工程;

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class Client extends JFrame

{

private JTextArea jTextArea;

private JTextField jTextField;

InputStream inputStream;

OutputStream outputStream;

static Socket socket;

public Client()

{

窗体///

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame jFrame=new JFrame("GG客户端");//新建窗体

jFrame.setBounds(200, 200, 320, 300);

jFrame.addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent we)

{

System.exit(0);

}

});

/文本域//

jTextArea=new JTextArea();//新建文本域

jTextArea.setEditable(false);//设置不可编辑属性

JScrollPane jScrollPane=new JScrollPane(jTextArea);

jFrame.getContentPane().add(jScrollPane,"Center");//添加到窗体

//面版和按钮属性事件//

JPanel jPanel_1=new JPanel();

JLabel jLabel=new JLabel("请输入消息");

jTextField=new JTextField(20);

jPanel_1.add(jLabel);

jPanel_1.add(jTextField);

JPanel jPanel_2=new JPanel();

JButton jButton_1=new JButton("发送");

jButton_1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

jTextArea.append("\n你说:"+jTextField.getText());

connetcSend();

jTextField.setText("");

}

});

JButton jButton_2=new JButton("取消");

jButton_2.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

jTextField.setText("");

}

});

JButton jButton_3=new JButton("退出");

jButton_3.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent ae)

{

System.exit(0);

}

});

jPanel_2.add(jButton_1);

jPanel_2.add(jButton_2);

jPanel_2.add(jButton_3);

JPanel jPanel_12=new JPanel(new GridLayout(2,1));

jPanel_12.add(jPanel_1);

jPanel_12.add(jPanel_2);

jFrame.getContentPane().add(jPanel_12,"South");

jFrame.show();

}

public void connectRecive()

{

//Socket socket;

try

{

String str;

while(true)

{

//socket=new Socket("127.0.0.1",6007);

inputStream=socket.getInputStream();

BufferedInputStream bufferInput=new BufferedInputStream(inputStream);

byte[] bty=new byte[100];

int len=bufferInput.read(bty);

str=new String(bty,0,len);

jTextArea.append("对方说:"+str+"\n");

if(str.equals("exit"))

break;

}

inputStream.close();

socket.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

public void connetcSend()

{

try

{

outputStream=socket.getOutputStream();

BufferedOutputStream bufferOutput=new BufferedOutputStream(outputStream);

bufferOutput.write(jTextField.getText().getBytes());

bufferOutput.flush();

}

catch(Exception e)

{

e.printStackTrace();

}

}

public static void main(String [] args) throws Exception

{

Client client=new Client();

socket=new Socket("127.0.0.1",6007);

client.connectRecive();

}

}

[此贴子已经被作者于2007-10-12 12:49:22编辑过]

----------------解决方案--------------------------------------------------------

哪出问题了 指点指点

说明:

public Client() 做客户端界

public Server() 面做服务器界面

public void connectRecive() 接收发来的消息

public void connetcSend() 发送要发出的消息

public void connectRecive() 在main()中初始化 一直用来监听外来消息

public void connetcSend() 只在按下按钮"发送" 才操作 发送数据

如果我把上面程序中标有/**AAAAAAAAA***/ 和标有/**CCCCCCCCCCCCC**/

它们互换注释 情况又是相反的结果??

有点奇怪

[此贴子已经被作者于2007-10-12 12:52:13编辑过]

----------------解决方案--------------------------------------------------------

没人帮忙看看吗??

----------------解决方案--------------------------------------------------------

应该是客户端向服务端发送请求,服务端反馈给客户端吧。

----------------解决方案--------------------------------------------------------

你每次要发给客户端都去等一下客户端连接,那当然有问题了

你应该把你监听到的客户端的连接保存起来,以后想怎么用就怎么用了,你可以用这个连接和客户端进行交互了

----------------解决方案--------------------------------------------------------

小千

----------------解决方案--------------------------------------------------------

干什么[05]

----------------解决方案--------------------------------------------------------

灌水

----------------解决方案--------------------------------------------------------

技术区不许灌水

----------------解决方案--------------------------------------------------------

以下是引用千里冰封在2007-10-11 13:29:27的发言:

你每次要发给客户端都去等一下客户端连接,那当然有问题了

你应该把你监听到的客户端的连接保存起来,以后想怎么用就怎么用了,你可以用这个连接和客户端进行交互了

呵呵 谢谢斑主 我回去慢慢 看看 呵呵

我觉得是这个问题

谢谢了

----------------解决方案--------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值