`

服务器和客户端的通信绘图

 
阅读更多

          还是先上图,现在的年轻人都不喜欢看文字,喜欢浏览图片,那就先把今天刚刚做完的一个东西先发出来,今天做完的“通信弹球”对于现在的我来说“现丑了”


                                                                图(a)
 


 

                                                         图(b)

图a是客户端的一个画板,图b是服务器端的一个画板,绘制在客户端的图像,通过一点点的协议和方法就能传到我们的服务器端,同时显示在服务器端的画板上,仔细看可能发现了(不仔细看也发现了)上面的图和下面的颜色有点不一样,这应该是延迟的原因,就像我们浏览网页时向服务器发送请求,要等半天才会有回应一样,就默认是这样的吧,在原谅的范围以内,图片也看了,下面开始今天的主题------通信。

         

        通信:通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法,使用何种媒质,将信息从某方准确安全传送到另方。(此处来自百度)

          上了这几节课,我对计算机上的通信的理解也就是:我有东西想给你,但是由于种种原因不能亲自给你,这可能有很多方面的原因,比如说是地域或者是不好意思,所以我要找一个东西来把我想给你的东西寄存在那里(在计算机上也就叫做服务器)如果你也想要知道给你的是什么东西!你就联系上它吧,但是,不是每个人平白无故的就能把我想给你的东西取走,就像寄快递的时候每个寄出的货物都有一个单号一样,服务器也是有号的要连接上他你就要知道他的单号是多少(也就是IP地址,和端口号),连接上后你就可以通过一点点的手段就可以把我的东西取走了。

          以上纯属个人见解,如有雷同不甚荣幸!

          怎么把东西放到寄存的那个地方呢?他又是怎么送到你的手上的呢?必须要有途径啊,就像快递通过海陆空送到各个地方一样,计算机中的信息也是一样,客户端要传到服务器里面,从服务器再传到客户端也是需要途径的,通信的“管道”,通过管道再加上一些通信的协议,就能实现数据的传输了,如下图所示:


 

                                                                               图(c)
 黑色的线就模拟了通信的通道,客户机和服务器连接,没个客户机对应着一套传输与接收的方法,进行数据的传输与共享。下面具体交代一下这几天学的东西。说说Java中是怎么实现服务器与客户端的。

 

在Java中要想编写网络通信,必须要用到java.net包下面的API,首先,我们来创建一个服务器,So easy  几行代码就可以搞定实例如下:

 

    Step1:

 

//创建一个服务器,并指定一个端口.
ServerSocket server = new ServerSocket(5678);

   PS:   端口号是什么?

               在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器交换机路由器用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。

             TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。对于这65536个端口号有以下的使用规定:

(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1---1023之间的端口号,是由ICANN来管理的;
(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;
(3)大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的
   所以,我们为我们自己写的服务器设置端口的时候应该避开前1024号端口.
Step2:服务器创建成功之后,就要让它进入等待状态,等待客户机的连接
/*客户机连接进入后,生成一个Socket对象,需要注意的是。调用了accept()方法
    *后,程序就会“阻塞”,就会等在这里,直到有一个客户机连接上来,这个方法才会返回,返回      * 的一个Socket对象就代表了服务器和客户机之间的连接,服务器和客户机上的通信就是在Socket     *对象client上进行
    /
    Socket client = server.accept();
 Step3:从Socket连接对象上调用方法得到输入输出流:
OutputStream out  = client.getOutputStream();
    InputStream  ins = client.getInputStream();
 Step4:使用输入输出流进行通信数据的读写,从输入流中读取从客户端发来的数据,在输出流写入数据   传送到客户端,这里需要注意的是不同类型的数据传输的机制是不同的入字符串就要先取得字符串的字节。
通过上面的四步一个简单的服务器就创建好了。真的不是很难。多练练那几行代码就能背下来了。
 
我们使用While()循环就能连接进来很多客户机
但是上面的服务器只能连接一个客户机,前一个退出后下一个才能接进来,原因就是调用accept()方法时卡卡住了,要等到第一个客户机执行完下面所有的事情之后,才能再次调用accept()方法,所以聪明的你应该想到了线程这个好东西,将进入服务器的每一个Socket对象交给一个线程去处理,接下来想要来接入的客户端就不需要等待了,直接开启下一个线程。然后用一个While(true)死循环来循环调用start()方法即可。
 
下面来说一下java中客户端的编写,一行代码,只要知道服务器的Ip地址和端口号示例如下:
//连接服务器
Socket socket = new Socket(ip,port);
 
但是要完成从服务器端的数据读写就要多写几行代码了
private DataInputStream dins;
    private DataOutputStream dous;	

         /**
	 * 连接服务器的方法
	 * @param ip 客户端的Ip地址
	 * @param port 服务器的端口号
	 * @return 成功返回true,失败返回false
	 */
	public boolean connServer(String ip,int port) {
		try {
			
			//连接服务器
			Socket socket = new Socket(ip,port);
			
			//得到输入输出流
			InputStream ins = socket.getInputStream();
			OutputStream ous = socket.getOutputStream();
			
			//读写通信数据
			dins = new DataInputStream(ins);
			dous = new DataOutputStream(ous);
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
        
    //从服务器上读取数据,以读取整形数据为例
	public void readFromServer() {
		while(true) {
			try {
				int x = dins.readInt();
				int y = dins.readInt();
			} catch (IOException e) {
				e.printStackTrace();
			}
		
		}
	}

    //向服务器发送数据以传输整形数据为例:
     public void sendXY(int x,int y) {
           try {
			dous.writeInt(x);
			dous.writeInt(y);
		} catch (Exception e) {
			e.printStackTrace();
		}
}

 

    最后把刚刚做完的一个小实验奉上,基于通信的”弹球“,主要的目的是练习服务器端界面编程和客户端的界面编程方法,还有数据的传递,熟练掌握后对后面一些基于通信的小游戏的开发应该有很大的帮助,自己做的游戏不再是单机版的了,也同时可以和小伙伴们一起玩耍。
 小实验一共为两个项目,一个是客户端,一个是服务器端,首先启动服务器,再启动客户端进行连接。


 
想要达到的效果就是小球能够实现在客户端和服务器端的同时弹动,代码很简单把主要的贴上。
客户端连接服务器并进行数据的传输的代码如上,下面贴上客户端控制小球运动和数据传输的代码:
package Tms.netjava.com;

import java.awt.Color;
import java.awt.Graphics;
/**
 * 客户端画小球的线程
 * 
 * @author sony
 * 
 */
public class DrawThread extends Thread {

	private Graphics g;
	private NetConn nc;
	//小球的初始坐标位置
	int x=200 ;
	int y=300 ;
       //设置小球的初试半径,后面碰到四周后,会越来越大,当大到一定程度时也可以缩小(没做)
	int rd = 20;
	//运动的速度为(1/36)秒每贞,看上去移动的比较平缓
	int speed = 1; 
	int red = 255;
	int green = 1;
	int blue = 255;
	//小球初始角度,是和正上方的夹角的大小
	private int angle=30;

	// 得到画布的高和宽

	public DrawThread(Graphics g) {
		this.g = g;
		nc = new NetConn();
		if (nc.connServer("192.168.56.1", 9090)) {
			// 读取数据

			nc.start();

		}
	}

	public void run() {

		while(true) {
			move();
			try {
				Thread.sleep(1000/36);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 小球运动的方法
	 */
	public void move() {
		
		//当小球碰到四周时,角度相应的变化,窗体的初始高和宽是(600,400)
		if(x<0||x>=600) {
			angle = 360 - angle;
			//碰到壁后改变小球半径
                         rd+=10;
		}
		if(y<0||y>=400) {
			angle = 180 - angle;
			rd+=10;
		}
		
		//测试代码
		System.out.println("x==="+x);
	    System.out.println("y==="+y);
	 
		double x11 = speed*Math.sin(angle*Math.PI/180);
	
		double y11 = speed*Math.cos(angle*Math.PI/180);
	
	   //因为计算的值为-1到1之间的小数,调用相应的向下floor()取整,和向上ceil取整方法
	   //并对计算值的正负进行判断,进行相应的处理,纸上画画就明白了。
		if(x11<0) {
			x += Math.floor(speed*Math.sin(angle*Math.PI/180));
		} else{
			x += Math.ceil(speed*Math.sin(angle*Math.PI/180));
		}
		
		if(y11<0) {
		
			y -=-Math.ceil(-y11);
		} else{
			y -=Math.ceil(speed*Math.cos(angle*Math.PI/180));
			
		}
		
		//给背景设置变化的颜色,也是清屏的颜色,变换的,好看一点
		
		red-=2;
		if(red<=0) {
			red=255;	
		}
		green+=5;
		if(green>=0) {
			green=255;	
		}
		blue-=7;
		if(blue<=0) {
			blue=255;
		}
		
		//将 数据传到服务器端
		nc.sendData(x, y,red,green,blue,rd);
		
		g.setColor(new Color(red,green,blue));
		g.fillRect(0, 0, 600, 400);
		//滚动的小球的颜色也随之改变
		g.setColor(new Color(green,blue,red));
		g.fillOval(x, y, rd, rd);
		
	}
}
   下面贴上服务器端的主要代码:
package tms.netjava.com;

import java.awt.Color;
import java.awt.Graphics;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TmsServer extends Thread {

	// 创建画布
	private Graphics g;

	public TmsServer(Graphics g) {
		this.g = g;
	}

	public void run() {
		this.startServer(5678);
	}

	public void startServer(int port) {
		try {

			System.out.println("创建服务器在端口:" + port);
			// 创建服务器
			ServerSocket ss = new ServerSocket(port);
			// 等待客户机的链接
			Socket client = ss.accept();

			// 打印客户机的地址
			System.out.println("连接进来一个客户机,客户机的地址为"
					+ client.getRemoteSocketAddress());

			// 取得输入输出流
			InputStream ins = client.getInputStream();
			OutputStream ous = client.getOutputStream();

			// 读写通信数据
			DataInputStream dins = new DataInputStream(ins);
			DataOutputStream dous = new       DataOutputStream(ous);

			// 从客户端得到发来的数据
			while (true) {
				int x = dins.readInt();
				int y = dins.readInt();
				int red = dins.readInt();
				int green = dins.readInt();
				int blue = dins.readInt();
				int rd = dins.readInt();

				// 清屏
				g.setColor(new Color(red, green, blue));
				g.fill3DRect(5, 5, 600, 400, false);

				// 利用得到坐标将指定的图形画出来
				g.setColor(new Color(green, blue, red));
				g.fillOval(x, y, rd, rd);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  
实现的效果也就是小球会在客户端的画布和服务器端的画布上变换着颜色弹动,越弹越大。
效果如下:
 


 

 
撞了几次墙之后:


 

 


 
 

 

最后总结:踏踏实实,一步一个脚印的慢慢的踩。即使路上布满荆棘,也要勇敢走下去,不管结果如何,吃多了还是会长胖。
 

 

 

 

 

 

 

 

 

  • 大小: 30.1 KB
  • 大小: 27.3 KB
  • 大小: 100.4 KB
  • 大小: 47.5 KB
  • 大小: 23.7 KB
  • 大小: 22.1 KB
  • 大小: 22.4 KB
  • 大小: 31.6 KB
  • 大小: 34.7 KB
  • 大小: 33.4 KB
3
3
分享到:
评论
1 楼 freezingsky 2014-03-20  
动手能力挺好!

相关推荐

    Qt客户端和服务器传输图片、文本

    在这个特定的项目中,"Qt客户端和服务器传输图片、文本"是利用Qt的网络模块进行TCP通信的一个实例。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于数据的...

    带服务器端和客户端的网络白板

    - **通信协议**:定义一套自定义协议来描述各种绘图操作,如“开始绘制”、“移动”、“结束绘制”等,确保服务器和客户端能正确解析和执行这些指令。 4. **实时性与性能优化**: - **增量更新**:为了减少网络...

    c#关于绘图示例,白板服务器,白板客户端,一个画图板

    在C#编程环境中,开发一个绘图示例、白板服务器和白板客户端涉及到多个关键知识点,这包括图形用户界面(GUI)设计、网络通信、多线程处理以及事件驱动编程。下面将详细阐述这些核心概念。 首先,C#中的绘图功能...

    vc++ 网络五子棋游戏服务端与客户端的实现网络五子棋游戏服务端与客户端的实现

    在本项目中,"vc++ 网络五子棋游戏服务端与客户端的实现"是一个基于VC++编程环境的网络应用程序,它涉及到的关键技术主要包括socket网络通信、图形界面设计和多线程处理。下面将详细阐述这些知识点。 1. **Socket...

    java课设实验报告(聊天程序+白板程序).docx

    程序包含服务器端和客户端两部分,支持多客户端同时连接到同一服务器,允许用户进行群聊和私聊。以下是具体实现的关键点: 1. **服务器端**:服务器使用Java的ServerSocket类监听指定端口,等待客户端连接。每当有...

    客户端和服务端聊天小工具

    【客户端和服务端聊天小工具】是一个基于TCP协议实现的多用户交互系统,它包含了丰富的功能模块,如计算器、记事本、音乐播放器和绘图工具。这个项目旨在提供一个简单但实用的通信平台,让多个客户端能够通过连接到...

    Socket 通信服务器

    首先,Socket编程涉及的基本概念包括Socket接口、套接字(Socket)对象、网络协议(如TCP/IP)以及服务器和客户端的概念。Socket接口是操作系统提供的编程接口,允许程序员通过调用特定的函数来创建、连接和通信套接...

    x11 server 源码

    1. **客户端-服务器模型**:理解X11如何通过网络进行通信,客户端发送绘图请求,服务器执行并返回结果。 2. **事件循环**:X11服务器如何处理来自客户端的事件,如键盘输入、鼠标点击、窗口移动等,并将这些事件...

    WEB客户端技术 WEB客户端技术

    在信息技术领域,Web客户端技术是构建互联网应用的核心部分,它涉及到用户通过浏览器或者其他Web接口与服务器进行交互的方式。本篇将深入探讨Web客户端技术的关键概念、技术栈以及应用实例。 首先,我们要理解Web...

    Linux图形界面中客户端、服务器、窗口管理器之间的关系

    综上所述,在 Linux 的图形界面环境中,X 协议作为核心通信协议,连接着客户端、服务器和窗口管理器,共同协作以提供丰富的图形用户体验。QT 和 framebuffer 等技术则提供了更多的选择和灵活性,使得开发者可以根据...

    MFC聊天程序客户端

    本文将深入探讨如何利用MFC来开发一个聊天程序客户端,特别是其GDI自绘窗口和非标题栏区域的设计,以及如何通过Socket技术实现网络通信。 首先,MFC是基于Windows API的,它封装了大量的Windows编程接口,使得...

    视频会议vc源码 客户端服务器端

    本文将深入探讨基于VC++的视频会议系统源码,包括客户端和服务器端的设计与实现,以及其中涉及到的关键功能模块。 首先,"中央管理服务器"在视频会议系统中扮演着核心角色,它负责调度会议资源,管理用户信息,处理...

    宝利通视频pc客户端

    在视频会议中,正确配置网闸信息是连接到服务器并进行安全通信的必要条件。 4. **服务器连接**:成功输入所有必要的信息后,客户端会尝试连接到宝利通的服务器。一旦连接建立,用户就能访问其账户,参与或发起视频...

    基于JAVA的五子棋游戏系统设计与实现.doc

    该系统使用 JAVA 语言,实现多线程技术和 SCOKET 技术,建立服务器与客户端之间的数据传输和通信,实现客户端和服务器端之间的同步处理。 一、开发背景 目前,计算机网络技术的发展已经渗透到现实生活和生产中,...

    网络实时画图程序 服务端+客户端

    而"CLient"和"Server"目录则分别包含了客户端和服务器的源代码或者编译后的可执行文件,用户可以在此基础上进行二次开发或调试。 总的来说,网络实时画图程序的服务端与客户端通过高效的通信机制实现了实时协作绘图...

    LabVIEW TCP通信(点对点通讯)

    本项目以LabVIEW为平台,通过构建服务器和客户端程序,实现了服务器发送波形数据,客户端接收并绘制波形图的功能。 首先,我们要理解TCP通信的基本原理。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议...

    C# 多机联合绘图代码

    本项目“C# 多机联合绘图代码”提供了一个基于TCP协议实现的解决方案,允许在一台主机(服务器)与多台附机(客户端)之间进行实时的图像同步绘制。下面我们将深入探讨这一技术实现的关键知识点。 首先,我们要理解...

    websocket坦克大战原形客户端

    WebSocket技术是现代网络通信中的一种重要协议,它允许在客户端和服务器之间建立持久的全双工连接,从而实现双向通信。在这个"WebSocket坦克大战原型客户端"项目中,开发者利用WebSocket和HTML5技术创建了一个简单的...

    Socket通信.zip

    Socket通信是计算机网络编程中的重要概念,主要用于实现两台设备之间的数据传输。在这个"Socket通信.zip...开发者可以通过该项目了解如何在Android环境中实现Socket通信,以及如何处理客户端和服务器端的数据交互。

    使用HTML5Canvas和PHPSwoole构建的五子棋小游戏客户端和服务端

    在五子棋游戏中,服务端使用Swoole创建WebSocket服务器,监听客户端的连接和消息,处理每个玩家的落子请求,检查胜负条件,并将结果推送给所有相关的客户端。 在五子棋的逻辑实现上,服务端需要维护当前的棋局状态...

Global site tag (gtag.js) - Google Analytics