没接触通信编程之前,总觉得通信好神秘,不知道移动通信是如何实现了“天涯若比邻”的梦想的。接触基本的通信原理后,才从技术层面对通信有了一定的了解。
基本的通信实现需要些什么呢?首先需要一个服务器和一个客户端。通信的基本过程就是服务器和客户端的交互,服务器将要传送的文件送到服务器,服务器根据客户端的要求发送给指定的客户端,从而完成了客户端通过服务器与其它客户端通信的目的。
下面来看一个完成基本通信的一个小例子
package tongxin;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import javax.swing.JTextPane;
import javax.swing.event.DocumentListener;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.Position;
import javax.swing.text.Segment;
public class Client {
ArrayList<ClientTread> list=new ArrayList<>();
public static void main(String[] args) {
Client cilent=new Client();
cilent.setUpPort(9090);
}
//开启服务器端口的函数
public void setUpPort(int port){
try {
ServerSocket ss=new ServerSocket(port);
System.out.println("程序运行了");
while(true){
/*当有客户端访问port端口时,接收一个socket对象,这个对象相当于客户端与服务器信息交流的管道*/
Socket s=ss.accept();
System.out.println("ppp");
/*这里启动线程,让线程去处理与客户端交互的问题,
服务端就可以一直等待下一个客户端的访问,如此便可实现多个客户端同时访问同一接口*/
ClientTread ct=new ClientTread(s,list);
list.add(ct);
ct.start();
}
}catch (Exception e1) {}
}
}
package tongxin;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
public class ClientTread extends Thread{
private Socket s;
private ArrayList<ClientTread> list;
OutputStream output;
public ClientTread(Socket s,ArrayList<ClientTread> list) {
this.s = s;
this.list=list;
}
public void run(){
try{
InputStream input=s.getInputStream();
output=s.getOutputStream();
String str="请输入姓名:";
//默认输入的第一次输入的是名字
sendMes(str+"\r\n");
String name=readLine(input);
while(true){
String mes=readLine(input);
System.out.println(mes);
//将消息发送给其他客户端
for(int i=0;i<list.size();i++){
ClientTread t=list.get(i);
if(t==this)continue;
t.sendMes(name+":"+mes+"\r\n");
}
if("bye".equals(s)){
input.close();
output.close();
s.close();
break;
}
}
}catch(Exception e2){}
}
public String readLine(InputStream input) throws IOException{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
while(true){
int n=input.read();
if(n=='\r')continue;
if(n=='\n')break;
bos.write(n);
}
byte bytes[]=bos.toByteArray();
String string = new String(bytes,"GBK");
return string;
}
public void sendMes(String mes) throws IOException{
output.write(mes.getBytes("GBK"));
output.flush();
}
}
package tongxin;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
public class ClientTread extends Thread{
private Socket s;
private ArrayList<ClientTread> list;
OutputStream output;
public ClientTread(Socket s,ArrayList<ClientTread> list) {
this.s = s;
this.list=list;
}
public void run(){
try{
InputStream input=s.getInputStream();
output=s.getOutputStream();
String str="请输入姓名:";
//默认输入的第一次输入的是名字
sendMes(str+"\r\n");
String name=readLine(input);
while(true){
String mes=readLine(input);
System.out.println(mes);
//将消息发送给其他客户端
for(int i=0;i<list.size();i++){
ClientTread t=list.get(i);
if(t==this)continue;
t.sendMes(name+":"+mes+"\r\n");
}
if("bye".equals(s)){
input.close();
output.close();
s.close();
break;
}
}
}catch(Exception e2){}
}
public String readLine(InputStream input) throws IOException{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
while(true){
int n=input.read();
if(n=='\r')continue;
if(n=='\n')break;
bos.write(n);
}
byte bytes[]=bos.toByteArray();
String string = new String(bytes,"GBK");
return string;
}
public void sendMes(String mes) throws IOException{
output.write(mes.getBytes("GBK"));
output.flush();
}
}
package tongxin;
//降低耦合度的接口
public interface MsgListener {
public void onRecvMsg(String msg);
}
相对于以前,这次代码比较多,代码比较难的地方写有注释,如果对线程和输入输出流的知识比较熟练的话,应该不难理解。