`
guanxianxiao
  • 浏览: 18626 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

浅谈通信

阅读更多
最近开始学习java通信编程也就是socket编程,在接触之前,对通信的感觉就是高大上的感觉,一台计算机,几行代码,就能实现收发信息,乍一看感觉不过如此,但如果仔细一想,QQ,微信,来往····,不都是以这为基础发展来的吗。
当想到QQ,微信的时候,你会不会觉得通信一个庞然大物呢?反正我最初是这么觉得的,以至于气势就被压制下去,所以学的很被动、很累。
但随着慢慢的接触,你会发现通信是个很大的概念,但真正属于通信的知识很少,可以说几行代码足以代表通信了。不信?那就请看
//1.创建服务器
			ServerSocket socket = new ServerSocket(port); 

这就有了个服务器程序了吧
Socket client = socket.accept();

这就有了客户端程序了吧
public  void startupServer(int port){
		
		try {
			//1.创建服务器
			ServerSocket socket = new ServerSocket(port);
			
			//2.让服务器循环等待
			while(true){
				Socket client = socket.accept();
			
				//3.得到客户端的输入输出流
				InputStream is = client.getInputStream();
				OutputStream os = client.getOutputStream();
				
				String message = "hello!!";
				os.write(message.getBytes());
				os.flush();
				int in = 0;
				while(in!=13){
					in = is.read();
					System.out.println("收到信息来自客户端的信息:"+in);
				}
				System.out.println("客户端按了回车,退出:"+in);
				client.close(); 	
				
				
				
				
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		
		
	}

然后服务器、客户端连接了吧
完了,没了,这就是通信的精华了。
这就相当于有两个人想相互打电话,我一人给了一部电话,然后又接通了两部手机之间的网络(服务器与客户端连接),难道这还不够吗?接下来就是他们说话的事情了(IO流,收发数据)。这个时候你就可以说你已经学会了通信了,但这就够了吗?现在不都喜欢人性化,友好化吗?你要让人家打电话打得舒服一点嘛
所以你会想让他们可以持续通话,聊到够为止,所以你需要让电话持续的接收对方的信息,怎么做呢?循环嘛
//2.让服务器循环等待
			while(true){
				Socket client = socket.accept();
			
				//3.得到客户端的输入输出流
				InputStream is = client.getInputStream();
				OutputStream os = client.getOutputStream();
				
				String message = "hello!!";
				os.write(message.getBytes());
				os.flush();
				int in = 0;
				while(in!=13){
					in = is.read();
					System.out.println("收到信息来自客户端的信息:"+in);
				}
				System.out.println("客户端按了回车,退出:"+in);
				client.close(); 	
				
				
				
				
			}

人总是不知足,现在我又想多人一起聊天怎么办呢?好办啊,多写几个循环分别读取各自的消息嘛,但怎么实现这刀哥循环呢?线程嘛,一个线程不就相当于一个循环嘛。
public void startUpServer(int port) {
		try {
			// 实例化服务器对象
			ServerSocket server = new ServerSocket(port);
			while (true) {
				// 等待客户机的连接
				Socket client = server.accept();
				// 当有一个客户机连接上后,将客户机对象交给一个单独线程处理
				ServerThread st = new ServerThread(client);
				st.start();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

线程类
public class ServerThread extends Thread{

	//待处理的客户机对象
	private Socket client;
	//待处理客户机对象的输入输出流
	private OutputStream os;
	private InputStream is;
	//线程构造方法,将客户机对象传过来
	public ServerThread(Socket client){
		this.client = client;
	}
	
	public void run(){
		//线程中处理客户机
		processChat();
	}
	
	//处理聊天任务的方法
	public void processChat(){
		try{
		//取得客户机对象的输入输出流
		os = client.getOutputStream();
		is = client.getInputStream();
		
		String s = "你好可以开始聊天了";
		sendMsg(os, s);
		String msg = readMsg(is);
		while(!msg.endsWith("#")){
			System.out.println(msg);
			msg = readMsg(is);
		}
		System.out.println(msg.substring(0,msg.length()-1));
		System.out.println("下线了!!");
		client.close();
		
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	//给该客户机发消息的方法
	public void sendMsg(OutputStream os,String msg){
		try {
			msg+="\r\n";
			os.write(msg.getBytes());
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	//读取客户机发送的消息的方法
	public String readMsg(InputStream is){
		String s = "";
		try {
		StringBuffer sb = new StringBuffer();
		int temp= is.read();
			while(temp!=13){
				sb.append((char)temp);
				temp= is.read();
			}
			s = sb.toString().trim();;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return s;
	}
	
}

现在功能差不多了,我又想让我的电话好看点,这样才炫,才有面子嘛,怎么办呢?小case吗,用swing编程呗,我想要给电话加个外壳,用JFrame呗,我想要给电话加个显示屏,用JTextField呗,我还想要键盘,不是有JButton吗,这样我的“电话”就初具规模了,接下来就是在一步步加上各种器件,比方说触摸屏(画板)啊,锁屏(登录界面swing)啊什么的,都可以慢慢往上加,现在想想看,关于通信的有多少东西呢?貌似就是前面那几行代码,其他的就是I/O的知识,Swing的知识,事件机制的知识,线程的知识。

好了,现在就可以说我们学完通信了。如果你真这么以为,那么你就打错特错了。在随后接触了java web编程,我发现我理解的通信有太过狭隘了。目前据我所知,通信应该是贯穿在两种模式中:一种就是C/S模式,一个client客户端,一个server服务器端。一种就是B/S模式,一个browser浏览器端,一个server服务器。

所以个人觉得通信就是不同机器之间的数据传输,抓住几个重点,就可以很好的把握通信技术了。一般通信会有对象代替客户端,比如PC机上的qq程序;会有一个或多个服务器用于管理各个客户端之间的交流及相关权限功能等,就相当于人类大脑一样;会大量用到I/O技术。然后就是基本功能的完善,比如界面编程,线程,各类算法,通信协议···。然后就是我们看似庞大的通信知识了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics