`
lj_gzy2014
  • 浏览: 16682 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java网络通信

    博客分类:
  • java
 
阅读更多

            没接触通信编程之前,总觉得通信好神秘,不知道移动通信是如何实现了“天涯若比邻”的梦想的。接触基本的通信原理后,才从技术层面对通信有了一定的了解。

              基本的通信实现需要些什么呢?首先需要一个服务器和一个客户端。通信的基本过程就是服务器和客户端的交互,服务器将要传送的文件送到服务器,服务器根据客户端的要求发送给指定的客户端,从而完成了客户端通过服务器与其它客户端通信的目的。

              下面来看一个完成基本通信的一个小例子

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);

}

                相对于以前,这次代码比较多,代码比较难的地方写有注释,如果对线程和输入输出流的知识比较熟练的话,应该不难理解。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics