小妹刚学java,用scoket编写了一个聊天室的代码,能支持多客户端,但就是信息无法发送给服务器端,下面是我客户端的代码,请各位大虾帮忙看一下我哪写错了,或是思路哪里不对,万分感谢!!
我服务器端用StringBuffer来存放所有客户的聊天内容!
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Client implements ActionListener,WindowListener{
JTextField jtf = new JTextField(25);
static JTextArea jta = new JTextArea(15,35);
Socket sk;
String temp = ""; //存放当前聊天信息
String state ="" ; //用于存放窗口的状态
@Override
public void windowClosing(WindowEvent we) {
state = we.WINDOW_CLOSING+"";
}
@Override
public void actionPerformed(ActionEvent ae) {
temp = jtf.getText();
System.out.println(temp+1);
jtf.setText("");
System.out.println(temp+2);
try{
show();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(temp+5);
}
public void show() throws Exception{
DataInputStream dis = new DataInputStream(sk.getInputStream());
System.out.println(dis);
DataOutputStream dos = new DataOutputStream(sk.getOutputStream());
String all = null; //存放整个聊天内容
if(!("201".equals(state))){ //当前窗口未关闭时
System.out.println(temp+3);
dos.writeUTF(temp); //将文本框中的内容写入到服务器端
while(true){
String s =dis.readUTF(); //从服务器端读出数据
if(s==null) break;
all = all+s;
}
System.out.println(temp+4);
System.out.println(all);
jta.setText(all); //将聊天内容显示在文本框中
}else{ //当前窗口关闭时
System.out.println(temp+6);
dos.writeUTF(state); //将窗口状态写入到服务器端
while(true){
String s =dis.readUTF();
if(s==null) break;
all = all+s;
}
System.out.println(all);
jta.setText(all); //将聊天内容显示在文本框中
dos.close();
dis.close();
sk.close();
}
}
public Client(Socket sk){
this.sk = sk;
JFrame jf = new JFrame("聊天室");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JLabel jl = new JLabel("fiona:");
JButton jb = new JButton("发送");
jp1.add(new JScrollPane(jta));
jp2.add(jl);
jp2.add(jtf);
jp2.add(jb);
jf.add(jp1);
jf.add(jp2,BorderLayout.SOUTH);
jb.addActionListener(this);
jf.addWindowListener(this);
jf.setSize(500,400);
jf.setResizable(false);
jf.setLocation(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws Exception{
Socket sk = new Socket("127.0.0.1",3171);
new Client(sk);
}
@Override
public void windowActivated(WindowEvent arg0) {
}
@Override
public void windowClosed(WindowEvent arg0) {
}
@Override
public void windowDeactivated(WindowEvent arg0) {
}
@Override
public void windowDeiconified(WindowEvent arg0) {
}
@Override
public void windowIconified(WindowEvent arg0) {
}
@Override
public void windowOpened(WindowEvent arg0) {
}
}
我服务器端用StringBuffer来存放所有客户的聊天内容!
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Client implements ActionListener,WindowListener{
JTextField jtf = new JTextField(25);
static JTextArea jta = new JTextArea(15,35);
Socket sk;
String temp = ""; //存放当前聊天信息
String state ="" ; //用于存放窗口的状态
@Override
public void windowClosing(WindowEvent we) {
state = we.WINDOW_CLOSING+"";
}
@Override
public void actionPerformed(ActionEvent ae) {
temp = jtf.getText();
System.out.println(temp+1);
jtf.setText("");
System.out.println(temp+2);
try{
show();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(temp+5);
}
public void show() throws Exception{
DataInputStream dis = new DataInputStream(sk.getInputStream());
System.out.println(dis);
DataOutputStream dos = new DataOutputStream(sk.getOutputStream());
String all = null; //存放整个聊天内容
if(!("201".equals(state))){ //当前窗口未关闭时
System.out.println(temp+3);
dos.writeUTF(temp); //将文本框中的内容写入到服务器端
while(true){
String s =dis.readUTF(); //从服务器端读出数据
if(s==null) break;
all = all+s;
}
System.out.println(temp+4);
System.out.println(all);
jta.setText(all); //将聊天内容显示在文本框中
}else{ //当前窗口关闭时
System.out.println(temp+6);
dos.writeUTF(state); //将窗口状态写入到服务器端
while(true){
String s =dis.readUTF();
if(s==null) break;
all = all+s;
}
System.out.println(all);
jta.setText(all); //将聊天内容显示在文本框中
dos.close();
dis.close();
sk.close();
}
}
public Client(Socket sk){
this.sk = sk;
JFrame jf = new JFrame("聊天室");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JLabel jl = new JLabel("fiona:");
JButton jb = new JButton("发送");
jp1.add(new JScrollPane(jta));
jp2.add(jl);
jp2.add(jtf);
jp2.add(jb);
jf.add(jp1);
jf.add(jp2,BorderLayout.SOUTH);
jb.addActionListener(this);
jf.addWindowListener(this);
jf.setSize(500,400);
jf.setResizable(false);
jf.setLocation(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) throws Exception{
Socket sk = new Socket("127.0.0.1",3171);
new Client(sk);
}
@Override
public void windowActivated(WindowEvent arg0) {
}
@Override
public void windowClosed(WindowEvent arg0) {
}
@Override
public void windowDeactivated(WindowEvent arg0) {
}
@Override
public void windowDeiconified(WindowEvent arg0) {
}
@Override
public void windowIconified(WindowEvent arg0) {
}
@Override
public void windowOpened(WindowEvent arg0) {
}
}
public void actionPerformed(ActionEvent ae) {
temp = jtf.getText();
System.out.println(temp+1);
jtf.setText("");
System.out.println(temp+2);
try{
show();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(temp+5);
}
在这个方法中调用write方法。
在write方法中不用死循环
private int flag = 0;//属性
在show()方法中
String input = flag+":"+userName+":"+temp; //把flag传输给服务器做判断
XX.writeUTF(input);//发送到服务器
flag = 0;
actionPerformed()方法中
触发一次,flag=1;//区别触发信息在服务器端中
private static String temp = "";run()方法中
Sting tt = XX.readUTF();//读取客户端信息
String[] ss = tt.split(":");//按:存到ss
String t = tt.subString(3);//舍去1:或0:
if(ss[0]==1){//如果是触发就加入缓存中
temp = temp+t;
}
XX.writeUTF(temp);
另外要一定时间清空缓存。
private int flag = 0;//属性
在show()方法中
String input = flag+":"+userName+":"+temp; //把flag传输给服务器做判断
XX.writeUTF(input);//发送到服务器
flag = 0;
actionPerformed()方法中
触发一次,flag=1;//区别触发信息在服务器端中
private static String temp = "";run()方法中
Sting tt = XX.readUTF();//读取客户端信息
String[] ss = tt.split(":");//按:存到ss
String t = tt.subString(3);//舍去1:或0:
if(ss[0]==1){//如果是触发就加入缓存中
temp = temp+t;
}
XX.writeUTF(temp);
另外要一定时间清空缓存。
@Override
public void actionPerformed(ActionEvent ae) {
temp = jtf.getText();
System.out.println(temp+1);
jtf.setText("");
System.out.println(temp+2);
try{
show();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(temp+5);
}