黑马程序员技术交流社区
标题:
Socket聊天室~
[打印本页]
作者:
Kelvinhu
时间:
2014-4-9 21:56
标题:
Socket聊天室~
代码有欠缺的地方请各位多多指教:),进入正题啦~
首先来进行服务端的编写,服务端几个小步骤:
//1、创建socket
ServerSocket server = new ServerSocket();
Socket socket = server.accept(); //监听作用,该方法为阻塞式
//2、创建流
DataInputStream ds = new DataInputStream(socket.getInputStream());
//3、进行数据的读写
String message = ds.readUTF();
System.out.println(message);
然后编写客户端,与服务器端大致相同,少了监听的方法。
//1、创建socket
Socket s = new Socket("127.0.0.1",6665);.
//2、创建流
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
//3、进行数据的读写
Scanner scanner = new Scanner(System.in);
String string=scanner.next();
dos.writeUTF(string);
dos.flush();
//4、用完了关闭
dos.close();
s.close();
以上就是大体的流程,然而我们需要多个人同时进入聊天室,则需要改成多线程的,代码如下
服务端:
import java.io.*;
import java.net.*;
public class Chat {
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(6665);
} catch (IOException e) {
System.out.println("端口被占用,创建端口失败。");
}
Socket socket = null;
while (true){
try {
socket = server.accept();
} catch (IOException e) {
System.out.println("客户端连接失败。");
}
new Thread(new Rev(socket)).start();
}
}
}
class Rev implements Runnable{
Socket socket = null;
Rev(Socket socket){
this.socket = socket;
}
public void run(){
String ip=socket.getInetAddress().toString();
try {
while(true){
DataInputStream ds = new DataInputStream(socket.getInputStream());
String message = ds.readUTF();
System.out.println(ip+": "+message);
}
} catch (IOException e) {
System.out.println("客户端"+ip+"已退出!");
}
}
}
客户端:
import java.net.*;
import java.io.*;
import java.util.*;
class Client{
public static void main(String args[]) throws Exception{
Socket s = new Socket("127.0.0.1",6665);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
while(true){
Scanner scanner = new Scanner(System.in);
String string=scanner.next();
if (string.equals("exit")){
System.out.println("退出了~");
s.shutdownInput();
dos.close();
s.close();
System.exit(0);
}
dos.writeUTF(string);
dos.flush();
}
}
}
作者:
袁啟雄x
时间:
2014-4-10 05:08
你好.代码写得很好.
我给你一些建议.你试一下修改,会更优秀.
但是因为在控制台下面做以下的动作有点坑.看着两条线程在抢控制台的控制权 - -
所以最好用Swing
建议:
既然是聊天室.一起聊天的人员至少两个吧.但是我看你代码.服务端处于不断监听的状态,那就是随时等待其他用户连接.但是忽略了一点.就是客户端发过来的消息最好由服务端转发给其他用户,所以最好用多线程.然后到了客户端.客户端和服务端建立连接后.必须要有即时性.所以用多线程.一条监听服务端发来的数据.这时你会问,服务端发什么数据给我?聊天室嘛.必须发其他用户发的消息给你.另外一条负责接收你的输入发送到服务端.
如果你按以上的建议去做.你会发现你能学到的东西很多.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2