java网络编程实现聊天室功能(多台电脑进行连接)
所谓的网络编程就是计算机之间的信息交互,对于程序员而言掌握一种编程方法相对就会简单的多。java SDK给我们提供了一些API来简化了程序的编写,网络编程的所有的类都存在在java.net.*里面。只要import一下就可以进入网络编程的世界了。网络编程有很多方法,Socket就是其中一种。
下面直接上代码了
package com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.util.ArrayList;import javax.xml.ws.handler.MessageContext.Scope;
/**服务端的类
**/
public class ServerClient extends Thread{
//定义一个集合将连接的客户端添加进来
private static ArrayList clients = new ArrayList();
public static void main(String[] args) {
try {
//设置服务端的端口
/*ps:当你ServerSocket serverSocket = new ServerSocket (8888)就已经建立了一个固定的位置可以让其它的计算机来访问你了。这里要稍微补充一下端口的支持,端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,这样服务器端已经建立好了。接着我们开始建立客户端,java同样提供了Socket对象来支持,只要客户端创建了Socket client = new Socket(InetAddress.getLocalHost(),8888),
客户端必须知道服务器的地址,java提供了InetAddress.getLocalHost()静态方法来获得服务器地址。好了,到目前为止两台计算机之间的关系已经建立好了。
*/
ServerSocket ss = new ServerSocket(8888);
//提示用户服务器已经启动了
System.out.println(“服务器启动”);
//死循环获取监听连接到服务端的客户端ip地址及电脑名
while (true) {
Socket client_socket = ss.accept();// 得到客户端连接
System.out.println(client_socket.getInetAddress() + “:”
+ client_socket.getPort() + “来连接!!!”);
//将连接的客户端添加到集合中
clients.add(client_socket);// 加入集合
//创建一个线程 传入 一个实例化对象ServerThread(客户端,客户集合) start 让线程进入就绪 //状态
new Thread(new ServerThread(client_socket, clients)).start();//
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerThread extends Thread {
private Socket client;// 指定客户端的Socket
private ArrayList clients;// 所有客户端Socket的集合
//定义构造方法进行赋值
public ServerThread(Socket client, ArrayList clients) {
this.client = client;
this.clients = clients;
}
//重写线程运行的方法
@Override
public void run() {
try {
// 读指定客户端数据的缓冲流
BufferedReader fromClient_br = new BufferedReader(
new InputStreamReader(client.getInputStream()));
// 不停读取指定客户端的数据并且不停向其它客户端发送
while (true) {
// 读指定客户端数据
String content = fromClient_br.readLine();
System.out.println(content);
String msg = client.getInetAddress() + “:” + client.getPort()
+ “发来的:” + URLDecoder.decode(content,“UTF-8”);
if (content != null && !"".equals(content.trim())) {
// 向其它客户端写
for (Object obj : clients) {
//获取到每一个客户端
Socket temp = (Socket) obj;
//除了发送消息的客户端之外的所有客户端都能收到服务端广播的消息
if (temp != client) {
//打印输出字符流(该方法自动刷新缓存)
PrintWriter toClient_pw = new PrintWriter(temp
.getOutputStream(), true);
//打印消息
toClient_pw.println(msg);
}
}
}
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.net.UnknownHostException;public class Client {
public static void main(String[] args) {
try {
//设置连接到的服务器端口
//ps:如果要做到两台电脑之间进行互发消息,需要处于同一个局域网中,比如说(wifi或热点IP //地址要一致) 192.168.43.167 是我两台电脑之间的连接的wifi 的IP地址 8888是服务端的端口号
Socket client_socket = new Socket(“192.168.43.167”, 8888);
new Thread(new ClientThread(client_socket)).start();
// 读取服务端数据的缓冲流
BufferedReader fromServer_br = new BufferedReader(
new InputStreamReader(client_socket.getInputStream()));
while (true) {
// 来自服务端的消息
String fromServer_content = fromServer_br.readLine();
fromServer_content = URLDecoder.decode(fromServer_content,
"UTF-8");
if (fromServer_content != null
&& !"".equals(fromServer_content))
System.out.println(fromServer_content);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ClientThread implements Runnable {
private Socket client;
public ClientThread(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
// 从控制台读取的缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
// 向服务端写数据的流
PrintWriter toServer_pw = new PrintWriter(client.getOutputStream(),
true);
while (true) {
// 将客户端输入的数据写向服务端
String toServer_content = br.readLine();
toServer_content = URLEncoder.encode(toServer_content, "UTF-8");
toServer_pw.println(toServer_content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}