标签:socket通信
课堂练习:
服务器端和客户端通信:
服务器端
package day16;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(1234);
System.out.println("服务启动");
while(true){
Socket socket=ss.accept();
System.out.println("连接进来了");
/*InetAddress ssadd=socket.getInetAddress();
String hostname=ssadd.getHostName();
String addr=ssadd.getHostAddress();
byte[] bytes=ssadd.getAddress();
System.out.println("socket.getInetAddress()= "+ssadd+"; ssadd.getHostName()= "+hostname+"; sadd.getHostAddress()= "+bytes);
int port=socket.getPort();
System.out.println("正在接受 "+ssadd+": 的请求");*/
InputStream is=socket.getInputStream();
OutputStream os= socket.getOutputStream();
//读取
BufferedReader br=new BufferedReader(new InputStreamReader(is,"gbk"));
//写入
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"gbk"));
String line=null;
while((line=br.readLine())!=null){
System.out.println("服务端收到数据 "+line);
String send="Hello "+line+"\r\n";
bw.write(send);
bw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}客户端:
package day16;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ClientSocketDemo {
public static void main(String[] args) {
try {
Socket socket=new Socket("localhost", 1234);
System.out.println("SOCKET");
//输入
InputStream is=socket.getInputStream();
//输出
OutputStream os= socket.getOutputStream();
//读取
BufferedReader br=new BufferedReader(new InputStreamReader(is,"gbk"));
//写入
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"gbk"));
//写入数据
bw.write("abc! \r\n");
bw.flush();
System.out.println("客户端收到数据 "+br.readLine());
bw.close();
/*while((line=br.readLine())!=null){
System.out.println("客户端收到数据 "+line);
bw.write("abc!");
}*/
} catch (Exception e) {
}
}
}运行结果:
/** * 服务器端: * 服务启动 * 连接进来了 * 服务端收到数据 abc! * * * 客户端: * 客户端收到数据 Hello abc! */
2.QQ服务端GUI界面
3.在分线程中完成ServerSocket推送消息给所有客户端。
List<OutputStream> ... = ;
代码部分(MessageReceiverThread.java)
package day16.QQ_simpleDemo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 消息接收线程
* @author a5967
*
*/
public class MessageReceiverThread extends Thread{
private QQGUI qqGUI;
private Socket sock;
private List<OutputStream> oslist=new ArrayList<OutputStream>();
private MessageServer server;
public MessageReceiverThread(QQGUI qqGUI,Socket sock){
this.qqGUI=qqGUI;
this.sock=sock;
}
public void run(){
while(true){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
String line=null;
while((line=br.readLine())!=null){
server=new MessageServer(qqGUI);
//更新推送的输出流
server.UpdatOutputStreamList(sock);
//更新聊天区域
qqGUI.updateHistory(SocketUtil.getAddr(sock),line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}代码部分(MessageServer.java)
package day16.QQ_simpleDemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MessageServer {
private QQGUI qqGUI;
//客户端集合
private List<String> clients=new ArrayList<String>();
//输出流所有含有输出流线程的对象
private static List<OutputStream> oslist=new ArrayList<OutputStream>();
public MessageServer(QQGUI qqGUI) {
this.qqGUI=qqGUI;
}
public QQGUI getQqGUI() {
return qqGUI;
}
public void setQqGUI(QQGUI qqGUI) {
this.qqGUI = qqGUI;
}
//启动消息服务器
public void start(int port){
try {
ServerSocket ss=new ServerSocket(port);
System.out.println("服务器启动");
//远程的地址
InetAddress rmaddress;
//远程端口
int rmport=0;
while(true){
final Socket sock=ss.accept();
//更新OutpurStream集合
new MessageReceiverThread(this.qqGUI,sock).start();
rmaddress=sock.getInetAddress();
rmport=sock.getPort();
//添加最新的联系人
clients.add(rmaddress.getHostName()+" : "+rmport);
//刷新列表
qqGUI.addcontact(clients);
}
} catch (Exception e) {
}
}
/**
* 推送消息
* @param string
*/
public void pushMessage() {
try {
BufferedWriter bw=null;
int a=oslist.size();
if(oslist.size()>0){
for(OutputStream clientos:oslist){
bw=new BufferedWriter(new OutputStreamWriter(clientos,"gbk"));
bw.write("有新人进入聊天室 \r\n");
bw.flush();
System.out.println("服务端推送数据数据结束");
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 更新OutputStream集合
* @param sock
*/
public void UpdatOutputStreamList(Socket sock) {
OutputStream os;
try {
os = sock.getOutputStream();
oslist.add(os);
} catch (IOException e) {
e.printStackTrace();
}
}
}运行结果:
/** * 部分运行结果 * 服务器部分: * 服务器启动 * 服务开始推发送数据 * 服务端推送数据数据结束 * 服务端推发数据完成 * 服务开始推发送数据 * 服务端推送数据数据结束 * 服务端推发数据完成 * 。。。 * * 客户端部分(三个客户端为例) * 客户端1 第1个连接进入的客户端 * 您已成功进入聊天室 * 客户端收到数据 有新人进入聊天室 * 客户端收到数据 有新人进入聊天室 * * 客户端2 第2个连接进入的客户端 * 您已成功进入聊天室 * 客户端收到数据 有新人进入聊天室 * * 客户端3 第3个连接进入的客户端 * 您已成功进入聊天室 */
4.推送联系人列表给所有客户端。
部分代码:
/**
* 推送最新的信息人列表给各个客户端
* @param newclientlist
*/
public void pushNewContactList(List<String> newclientlist) {
try {
BufferedWriter bw=null;
int a=oslist.size();
if(oslist.size()>0){
for(OutputStream clientos:oslist){
bw=new BufferedWriter(new OutputStreamWriter(clientos,"gbk"));
bw.write("当前联系人有\r\n");
for(String contact:newclientlist){
bw.write(contact+"\r\n");
bw.flush();
}
System.out.println("服务端推送当前联系人列表数据结束");
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 部分运行结果
* 服务器启动
* 服务开始推发送数据
* 服务端推送数据数据结束
* 服务端推发数据完成
* 服务端推送当前联系人列表数据结束
* 。。。
*
*
* 客户端部分(三个客户端为例)
* 客户端1 第1个连接进入的客户端
* 您已成功进入聊天室
* 客户端收到数据 当前联系人有
* 客户端收到数据 127.0.0.1 : 50709
* 客户端收到数据 有新人进入聊天室
* 客户端收到数据 当前联系人有
* 客户端收到数据 127.0.0.1 : 50712
* 客户端收到数据 127.0.0.1 : 50709
* 客户端收到数据 有新人进入聊天室
* 客户端收到数据 当前联系人有
* 客户端收到数据 127.0.0.1 : 50712
* 客户端收到数据 127.0.0.1 : 50713
* 客户端收到数据 127.0.0.1 : 50709
*
* 客户端2 第2个连接进入的客户端
* 您已成功进入聊天室
*客户端收到数据 当前联系人有
*客户端收到数据 127.0.0.1 : 50825
*客户端收到数据 127.0.0.1 : 50827
*客户端收到数据 有新人进入聊天室
*客户端收到数据 当前联系人有
*客户端收到数据 127.0.0.1 : 50825
*客户端收到数据 127.0.0.1 : 50827
*客户端收到数据 127.0.0.1 : 50828
*
* 客户端3 第3个连接进入的客户端
* 您已成功进入聊天室
*客户端收到数据 当前联系人有
*客户端收到数据 127.0.0.1 : 50825
*客户端收到数据 127.0.0.1 : 50827
*客户端收到数据 127.0.0.1 : 50828
*/本文出自 “11138113” 博客,请务必保留此出处http://11148113.blog.51cto.com/11138113/1787931
标签:socket通信
原文地址:http://11148113.blog.51cto.com/11138113/1787931