import java.io.IOException
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.InetAddress
import java.net.Socket
import java.net.UnknownHostException/**
* 网络编程 聊天程序 文件传送程序
*
* @author zb
*
*/
public class SocketTalkingClient { public static void main(String[] args) {
SocketTalkingClient st = new SocketTalkingClient()
try
{
st.createClient()
}catch(Exception e)
{
e.printStackTrace()
}
} int port = 1129
public void createClient() throws UnknownHostException, IOException {
Socket server = new Socket(InetAddress.getLocalHost(), port)
BufferedReader in = new BufferedReader(new InputStreamReader(server
.getInputStream()))
PrintWriter out = new PrintWriter(server.getOutputStream()) BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)) while (true) {
String line = wt.readLine()
out.println(line)
out.flush() String receiveWord = in.readLine() System.out.println("Client: receive -->" + receiveWord)
if (receiveWord.equals("exit")) {
break
}
} server.close()}}
服务端:package com.toolimport java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.io.PrintWriter
import java.net.ServerSocket
import java.net.Socket/**
* 网络编程 聊天程序 文件传送程序
*
* @author zb
*
*/
public class SocketTalking { public static void main(String[] args) {
SocketTalking st = new SocketTalking()
try
{
st.createServer()
}catch(Exception e)
{
e.printStackTrace()
}
} int port = 1129public void createServer() throws IOException {
// 建立一个固定位置的服务方
// 这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.
// 另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip
// 作为保留端口,因此你所分配的端口只能是1024个之后的
ServerSocket server = new ServerSocket(port) //每一个客户端启动一个线程处理
while (true) {
MultiClient client = new MultiClient(server.accept())
client.start()
} } /**
* 服务端的多线程运行 接收多个客户端
*
* @author Administrator
*
*/
class MultiClient extends Thread { private Socket socket public MultiClient(Socket s) {
socket = s
} public void run() { try {
// 读取socket
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream())) // 写入socket
PrintWriter out = new PrintWriter(socket.getOutputStream()) while(true)
{
String str = in.readLine()System.out.println("Server: receive -->" + str)//服务端向客户端发送报文
out.println(str)out.flush()if (str.equals("exit")) {
break
}
}
socket.close()
} catch (Exception e) {
e.printStackTrace()
} finally {
System.out.println("this Thread is over")
//如果保存服务端不关闭 一直运行 可以注释掉改方法 以适用多个线程 多个客户端的情况
System.exit(0)
} }
}}
聊天具体是这么聊,聊天室、群聊、一对一。java其实websocket足矣,ws服务器部署起来,客户端程序连接ws服务器服务,用服务器转发作为消息传输机制,当然你要大文件传输和视频通话就用socket转发连接,p2p通信,这里的p2pjava因为都是服务器部署,不需要做外网打洞穿透,因为web服务器他是本地环境,明白不。你用windows应用程序就需要外网穿透打洞,你不可能视频数据也让服务器转发吧,聊天人数越来越多,服务器承受不了,它需要服务器指派点对点单向传输,不去途径服务器。