这是我的程序:服务端
package 聊天;import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JFrame;
import javax.swing.JTextField;public class 服务端 {
public static void main(String[] args) {
JFrame f = new JFrame("服务器");
JTextField text = new JTextField(20);
f.add(text,BorderLayout.NORTH);
f.setSize(300, 400);
f.setLocation(100,100);
f.setVisible(true);
int i = 1;
ServerSocket s = null;
try {
s=new ServerSocket(8888);
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
while (true) {
try {
Socket s1=s.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));
PrintWriter out = new PrintWriter(s1.getOutputStream());
out.println("您是第"+i+"个连接服务器的!");
out.flush();
text.setText(in.readLine());
i++;
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} } }客户端:package 聊天;import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JFrame;
import javax.swing.JTextField;public class bbb { String setword = null;
JFrame f = new JFrame("客户端");
JTextField text = new JTextField(20);
JTextField textInput = new JTextField(20);
PrintWriter out;
public bbb(){
textInput.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent arg0) {
// TODO 自动生成方法存根
} public void keyReleased(KeyEvent arg0) {
// TODO 自动生成方法存根
} public void keyTyped(KeyEvent arg0) {
// TODO 自动生成方法存根
if (arg0.getKeyChar()==KeyEvent.VK_ENTER) {
out.println(textInput.getText());
out.flush();
try {
Socket s1 = new Socket("127.0.0.1",8888);
out = new PrintWriter(s1.getOutputStream());
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}});
f.add(text,BorderLayout.NORTH);
f.add(textInput,BorderLayout.SOUTH);
f.setSize(300, 400);
f.setLocation(100,100);
f.setVisible(true);
try {
Socket s1 = new Socket("127.0.0.1",8888);
BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));
text.setText(in.readLine());
out = new PrintWriter(s1.getOutputStream());
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
System.out.println("连接服务器失败");
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
bbb b = new bbb();
}}客户端连接服务器端 并可以发消息给服务器端 服务器端显示出来
我每次发消息都要建立新的socket,不建新的服务器收不到,socket必须这样吗? 不能建一个socket持续传消息吗?
package 聊天;import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JFrame;
import javax.swing.JTextField;public class 服务端 {
public static void main(String[] args) {
JFrame f = new JFrame("服务器");
JTextField text = new JTextField(20);
f.add(text,BorderLayout.NORTH);
f.setSize(300, 400);
f.setLocation(100,100);
f.setVisible(true);
int i = 1;
ServerSocket s = null;
try {
s=new ServerSocket(8888);
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
while (true) {
try {
Socket s1=s.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));
PrintWriter out = new PrintWriter(s1.getOutputStream());
out.println("您是第"+i+"个连接服务器的!");
out.flush();
text.setText(in.readLine());
i++;
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
} } }客户端:package 聊天;import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JFrame;
import javax.swing.JTextField;public class bbb { String setword = null;
JFrame f = new JFrame("客户端");
JTextField text = new JTextField(20);
JTextField textInput = new JTextField(20);
PrintWriter out;
public bbb(){
textInput.addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent arg0) {
// TODO 自动生成方法存根
} public void keyReleased(KeyEvent arg0) {
// TODO 自动生成方法存根
} public void keyTyped(KeyEvent arg0) {
// TODO 自动生成方法存根
if (arg0.getKeyChar()==KeyEvent.VK_ENTER) {
out.println(textInput.getText());
out.flush();
try {
Socket s1 = new Socket("127.0.0.1",8888);
out = new PrintWriter(s1.getOutputStream());
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}});
f.add(text,BorderLayout.NORTH);
f.add(textInput,BorderLayout.SOUTH);
f.setSize(300, 400);
f.setLocation(100,100);
f.setVisible(true);
try {
Socket s1 = new Socket("127.0.0.1",8888);
BufferedReader in = new BufferedReader(new InputStreamReader(s1.getInputStream()));
text.setText(in.readLine());
out = new PrintWriter(s1.getOutputStream());
} catch (UnknownHostException e) {
// TODO 自动生成 catch 块
System.out.println("连接服务器失败");
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
bbb b = new bbb();
}}客户端连接服务器端 并可以发消息给服务器端 服务器端显示出来
我每次发消息都要建立新的socket,不建新的服务器收不到,socket必须这样吗? 不能建一个socket持续传消息吗?
如果public void keyTyped(KeyEvent arg0)方法里的
Socket s1 = new Socket("127.0.0.1",8888);
out = new PrintWriter(s1.getOutputStream());
不写 服务器就收不到第二次以后的消息 咋改啊?
吧建立socket与消息发送分开
消息发送在while循环里,根据特定条件,结束发送,关闭socket
聊天的程序么?
楼主看下我这个 http://blog.csdn.net/java_cxrs/archive/2009/01/13/3769573.aspx
用Socket编写聊天程序,最主要的应该要掌握两点:
第一:服务器端多线程
第二:客户端多线程
而这里的多线程,从你的代码里面没有体现出来,当然,代码不是必须得这样去编写,但是一般来说这是一个规范,而且也是一个很好的思路。
方法:
服务器端:两个线程,一个负责专门等待客户端的连接,核心代码为:Socket client = serverSocket.accept();第二个线程主要负责所有客户端发来的消息的处理。
服务器端:一个线程,就负责接受并解析所有的消息。
严格按照这样的方式去编写代码去改写你的代码的话,很快就会实现的。楼主不妨试一下...
如果需要的话,我可以给你共享一下我以前的代码
2.在ActionListener方法里向服务端发送数据 关闭窗口时close掉输出流
3.服务端只要有客户端连上就接收客户端的数据
你这个都显示在客户端的textarea上了 我是要客户端写的东西都显示在服务器端啊 并且持续的就收信息
Socket s1=s.accept();你这种方法是客户端每发一次请求就新建一个连接,连上之后就不管了。