我们一起学通信


        今年的暑假集训,主要学的技术就是通信了,通过了解、学习、运用通信,我又进一步认识到了技术的深奥与伟大。初次接触通信,我所了解到的最简单的例子就是QQ。如不是学习了通信,我还从不了解QQ之间的通话到底是怎么回事,只能推测是一个窗口发消息一个窗口接收消息,殊不知聊天的两个窗口都只是客户端,而中间起最重要作用的是一个服务器。两个客户端都要讲消息发送到服务器,服务器再将消息发送到应发送到的客户端。那么,这时候会有人问:“那消息是如何传送的呢,又是以什么样的形式传送的?”这里,我们需要了解stream流的概念。

       java中输入输出相关的类都是java.io包中,java将输入和输出抽像为叫做流的概念,并提供了相应的实现类;流是程序和外界进行数据交换的通道在OOP中的表现,可以将流对象理解从一个水管,它从一个地方输入流据,向另外一个地方输出数据:输入流是我们在程序中从某个地方(文件、网络)读取数据时使用;输出流是我们将数据发送到某个地方(文件、网络、控制台)时使用。
  
       流按方向分为输入流(InputStream)和输出流(OutputStream):程序可以使用输入流对象从数据源读取数据,使用输出流对象向目的地写出数据,对应的流类名中一般有Input和Output词。
    流按性质分为:
  
     基础字节流(原始流):   InputStream和OutputStream是java中可以按最小数据单位读取的流,即每次读写一个字节,基础流是直接连结到输入源的流。


      过滤流(节点流):   过滤流是用来包装基础流以提供更好的特性,如提供缓冲功能的BufferedInputStream和BufferedOutputStream;过滤流是用来包装基础流或其它流(以其它流对象为构造参数)---它并不直接连结到数据源。

       基与具体数据类型的流:  如果要从流中读取指定的数据类型的数据,如int,long型的数值,则要使用DataInput/DataOutput接口的子类如DataInputStream和DataOutputStream;
基与对象读写:JDK提供了一种强大的功能流,即对象的输入输出流,即ObjectInput/ObjectOutput接口的子类,如我们使用ObjectOutputstream将一个java对象写入到文件中;对象流的读取就是常说的java对象序列化技术。

       当我们发送消息时,就把数据存放在输出流里,当我们接收数据是就从输入流里读取数据。下面我们以一个服务器(可以接受消息,可以发送消息)为例:

                   ServerSocket server=new ServerSocket(p1234);//在指定端口1234上启动一个服务器。
                   Socket client=server.accept();//让服务器进入等待状态,创建一个ServerSocket client。
                   OutputStream out=client.getOutputStream();
            InputStream ins=client.getInputStream();
                   BufferedReader reader = new BufferedReader(new InputStreamReader(ins, "gb2312"));
                   BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "gb2312"));
                    String s="hellow,你好.com"+"\r\n";
                      writer.write(s);
                      writer.flush();//通过输出流发送数据
     while(true){
                   String str = reader.readLine();//从输入流中读取数据
                     if(str == null)
                     break;}
        类似的,我们可以运用通信来做一个网络画板。当我们在一方画时,另一方也同样在画:
 客户端在画的同时不断将数据输入到输出流里,服务器端不断从输入流里读取数据,并在服务器端的画板上画。代码如下:

服务器端:

import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;

public class ServerJFrame extends JFrame implements Runnable{
	private Socket sc;
	String s4[] = new String[4];
	Graphics gr;
	public static void main(String[]arg) throws IOException{
			new ServerJFrame().step(1234);
	}
	public ServerJFrame(){
		this.setTitle("在我上面接收");
		this.setBounds(400, 300, 400, 300);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		this.setVisible(true);
		gr = this.getGraphics();
	}
	public void run() {
			try {
				InputStream ins = sc.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
				while(true){
						String s = reader.readLine();
						if(s == null)
							break;
						s4 = s.split(" ");
						int x1 = Integer.parseInt(s4[0]);
						int x2 = Integer.parseInt(s4[1]);
						int x3 = Integer.parseInt(s4[2]);
						int x4 = Integer.parseInt(s4[3]);
						gr.drawLine(x1, x2, x3, x4);
				}
				sc.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	
	public void step(int port) throws IOException{
			ServerSocket ss = new ServerSocket(port);
			while(true){
					sc = ss.accept();
					new Thread(this).start();
			}
	}
	
}

 客户端

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;

public class ClientFrame extends JFrame implements Runnable,MouseMotionListener,MouseListener{
	BufferedWriter writer;
	boolean bto = true;
	int x1,y1,x2,y2;
	Graphics gr;
	public static void main(String []arg){
			new Thread(new ClientFrame()).start();
	}
	public ClientFrame(){
		this.setTitle("在我上面画!");
		this.setBounds(400, 300, 400, 300);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		this.setVisible(true);
		gr = this.getGraphics();
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}
		public void run(){
				try {
					Socket sc = new Socket("localhost",1234);
					
					OutputStream out = sc.getOutputStream();
					writer = new BufferedWriter(new OutputStreamWriter(out));
					while(bto){
						
					}
					sc.close();
				} catch (Exception ex){
					bto = false;
				}
			
		}
		public void sendMsg(int x1,int y1,int x2,int y2) throws IOException{
				writer.write(x1+" "+y1+" "+x2+" "+y2+"\r\n");
				writer.flush();
		}
		@Override
		public void mouseDragged(MouseEvent e) {
				x2 = e.getX();
				y2 = e.getY();
				gr.drawLine(x1, y1, x2, y2);
				try {
					this.sendMsg(x1, y1, x2, y2);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				x1 = x2;
				y1 = y2;
		}
		@Override
		public void mouseMoved(MouseEvent e) {
		}
		@Override
		public void mouseClicked(MouseEvent e) {
			
		}
		@Override
		public void mousePressed(MouseEvent e) {
				x1 = e.getX();
				y1 = e.getY();
		}
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
}

 

运行结果:

       在学习通信的过程中,我遇到了一些问题,以前用的少所以没注意,我在传参这方面有些混乱,局部变量经常当成全局变量用导致经常出错,还有就是输入输出流用的不太熟练,我会多加练习,正确熟练运用输入输出流,学好通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值