`

手机与PC的网络协议

 
阅读更多

                                                 手机客户端与PC服务端的网络通信

                 前面我们学过电脑与电脑之间的通信,以及多人聊天协议,现在我们就用一台电脑做服务器,一部手机做客户端,来实现手机与电脑之间的通信啦。

                 首先,异曲同工,在手机上建立客户端与在电脑上是差不多的,首先我们现在电脑上面建立服务器

如下:

package 手机与PC端通信;

import java.io.IOException;




import java.net.ServerSocket;
import java.net.Socket;



public class Server {
	
	public void setup(int port){
		
			try {
				//创建服务器
				ServerSocket host=new ServerSocket(port);
				System.out.println("通信端口"+port+"成功开启");
				while(true){
					//等待客户端访问
					Socket socket=host.accept();
					System.out.println("有人访问了");
					//把跟客户端交流的事情交给线程处理
					ServerThread st = new ServerThread(socket);
					//开启线程					
					st.start();

				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args){
		//传入端口号
		new Server().setup(8888);
	}

}

 接下来建立线程来处理socket得到的输入流以及输出流:

package 手机与PC端通信;

import java.io.DataInputStream;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread extends Thread {
	private Socket socket;
	private DataOutputStream  dos;
	public ServerThread(Socket socket){
		this.socket=socket;
	}
	

	public void run(){
		//得到网络连接socket得到的输出输入流
		try {
			//输入流
			InputStream input=socket.getInputStream();
			
			DataInputStream dis=new DataInputStream(input);
			//得到客户端的输出流
			dos=new DataOutputStream(socket.getOutputStream());
			//读取客户端发到服务端的字节
			while(true){
				   int msgType=dis.readInt();
				
					int len=dis.readInt();
					byte[] bytes=new byte[len];
					dis.readFully(bytes);
					String content=new String(bytes,"GB2312");
					System.out.println("客户端说:"+content);
					
					
					    //这里是发到客户端的
						String replyString = "服务器收到了("+content+")";
						bytes = replyString.getBytes("GB2312");
						
						//写进是文字  1
						dos.writeInt(1);
						//输出流写进字节长度
						dos.writeInt(bytes.length);
						//写进字节
						dos.write(bytes);
						//刷新
						dos.flush();
					}
				
			
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

  这些内容在上节中都已经讲过,这里不做过多阐述

接下来就是重点内容啦,就是在Android中建立客户端,这里我们要使用带安卓插件的eclipse来编写

首先处理界面,我大概定义了一个textview来显示聊天内容,editText来进行输入框的角色,再者就是一个发送按钮,这样一个简单的聊天界面就已经完成了,如下,简洁的小界面,读者们可以自行美化界面哈:


(最后记得绑定发送按钮到指定函数哦)

接下来就是在MainActivity中开始动工了,动工之前,讲一个非常重要的函数Handler,我们知道,在UI界面主线程中,我们肯定要获取到输入框输入的文字来发送到服务器上,Android里面的线程是不能直接访问Ui组件的,例如:在另一个线程调用textView。setText(“23232”);在编译的时候是没有问题的,但是在运行时就会报错,所以这时候就要用到handler的函数,我们在这里可以理解为一个中介,子线程将信息绑定在handler上,handler将信息更新到主函数UI上,里面会用到callBack函数,具体代码里讲,万事俱备,只差将网络权限添加到你的手机上了,在AndroidMainfest.xml文件中,在<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />后面添加网络允许代码,就是下面这一句
    <uses-permission android:name="android.permission.INTERNET"/>

接下来,就是UI界面MainActivity.java代码如下:

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    //聊天区域
	private TextView textMsgLog;
	//客户端处理线程
	private ClientThread clientThread;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnSend=(Button)findViewById(R.id.btnSend);
		//聊天显示界面
		textMsgLog=(TextView)findViewById(R.id.textMsgLog);
		Log.i("test", "oooooooooooooo11111");
		//创建Handler对象,介于主线程和子线程一个代理,子线程ClientThread将要传递的数据通过
		//Handler传递给主进程UI,数据在UI上更新
		Handler.Callback callback=new Handler.Callback(){
			public boolean handleMessage(Message msg){
				
					//
					textMsgLog.append("服务器:" + msg.obj.toString() +
					"\n");
				
				return true;
			}
			
		};
		
		
	    Handler handler=new Handler(callback);
	    clientThread =new ClientThread(handler);
	    clientThread.start();
	    
	    
	}
	//将文本输入框的发送给服务器
	public void send(View v){
		
		//得到输入框
		EditText editInput = (EditText)findViewById(R.id.editInput);
		//得到输入框中文字
		String msg = editInput.getText().toString();
		//调用,写到服务器上,返回成功
		boolean result = clientThread.sendText(msg);
		textMsgLog.append("我:"+msg+"\n");
		if(result){
		textMsgLog.append("我:"+msg+"\n");
		editInput.setText("");
		} else {
		Toast.makeText(this, "发送失败", Toast.LENGTH_LONG).show();
		}
		
	}
		
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

 和客户端线程,也就是刚才说的子线程代码:

ackage com.example.eetalk;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Handler;
import android.os.Message;

public class ClientThread extends Thread {
	private Handler handler;
	private DataOutputStream dos;
	private DataInputStream dis;
	private Socket socket;

	public ClientThread(Handler handler) {
		this.handler = handler;
	}

	public void run() {
		try {
			connect();
			dos.writeInt(1);
			dos.writeInt(5);
		    dos.write("hello".getBytes());
			while (true) {
				//读取服务器发过来的数据
				int msgType = dis.readInt();
				//
				System.out.println("121");
					//
					int len = dis.readInt();
					//
					byte[] bytes = new byte[len];
					dis.readFully(bytes);
					//
					String content = new String(bytes, "GB2312");
					Message msg = new Message();
					msg.what = 1;
					//
					msg.obj = content;
					//
					handler.sendMessage(msg);
				
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//close();
		}

	}

	private void connect() throws UnknownHostException, IOException {
		//
		socket = new Socket("172.27.35.3", 8888);
		//
		dis = new DataInputStream(socket.getInputStream());
		
		dos = new DataOutputStream(socket.getOutputStream());

	}

	private void close() {
		if (dis != null) {
			try {
				dis.close();
			} catch (IOException e) {
			}
		}
		if (dos != null) {
			try {
				dos.close();
			} catch (IOException e) {
			}
		}
		if (socket != null) {
			try {
				socket.close();
			} catch (IOException e) {
			}
		}
	}
	//发送到服务器的
	public boolean sendText(String content){
		try {
		//
		byte[] bytes = content.getBytes("GB2312");
		//
		dos.writeInt(1);
		//
		dos.writeInt(bytes.length);
		//
		dos.write(bytes);
		dos.flush();
		return true;
		} catch (IOException e) {
		e.printStackTrace();
		}
		return false;
		}
}

 

记住你的手机和你的电脑一定要在同一个局域网,这里可以看出手机的客户端做法与电脑是差不多的,上面手机客户端连接的ip地址是你的电脑连入的ipv4地址,可以在cmd命令里恰如ipconfig来搜寻。

做到这里,将你的app下载到手机,打开服务器,打开手机的应用程序,就可以聊天了,记住打开网络

美美聊天了:


这是服务器

 

这是手机客户端
 

 

 



 做到这里,就可以和手机互发图片和文字啦,这是小编下期的实现目标酷

 

  • 大小: 4.1 KB
  • 大小: 110.2 KB
  • 大小: 87.1 KB
  • 大小: 4 KB
  • 大小: 9.5 KB
3
0
分享到:
评论

相关推荐

    孙桥:PC与Android设备间的数据通信

    随着移动应用越来越多的依赖于服务端,开发者对数据通信协议的需求慢慢增多。...豌豆荚自行研发设计的 PMP 协议,并采用 Protobuf 等技术手段都很好的解决了不管是手机与手机还是手机与 PC 之间的通信问题。

    手机网络游戏

    系统介绍 从手机游戏依托的技术平台来看,目前Java手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上... 向PC端开发靠拢,为以后PC与手机互联奠定基础

    java手机游戏,手机网络游戏

    从手机游戏依托的技术平台来看,目前Java手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上游戏世界。...向PC端开发靠拢,为以后PC与手机互联奠定基础

    手机网络游戏象棋java源代码

    系统介绍 从手机游戏依托的技术平台来看,目前Java手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上... 向PC端开发靠拢,为以后PC与手机互联奠定基础

    手机网络游戏 - Java源码 - 游戏

    手机版象棋游戏采用MIDP1.0开发,在低端手机上运行的同时,保证了高端手机的兼容性,其市场发展空间巨大。伴随着中国移动GPRS和中国联通CDMA1X数据业务的开展,手机游戏...向PC端开发靠拢,为以后PC与手机互联奠定基础

    PC电脑投屏到三星电视的软件smart view

    三星手机自带的smart view是很多小伙伴在用的,使用...温馨提示:三星手机系统内置有一个叫做SmartView的功能,但是SmartView仅支持通过Miracast协议来投屏,如果你的电视不支持Miracast协议,则是无法使用这个功能。

    手机网络游戏 JAVA源码

    从手机游戏依托的技术平台来看,目前Java手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上游戏世界... 向PC端开发靠拢,为以后PC与手机互联奠定基础

    动态主机配置协议 DHCP 是 RFC 1541定义的标准协议,该协议允许服务器向客户端动态分配IP地址和配置信息

    DHCP协议支持C/S(客户端/服务器)结构,主要分为两部分:DHCP客户端通常为网络中的手机、PC、打印机等终端设备,使用从DHCP服务器分配下来的IP信息,包括IP地址、默认网关及DNS等。DHCP服务器:用于管理所有的IP...

    易语言-QQPC8.6协议源码(已完成登录,接收,发送)

    已完成的分析:0025,0036,0028,0001,00BA,00EC,00CE,005C,0002 完成简单的发送私聊消息和发送群聊消息,文件内包含了一些分析的结果 本程序为完整开源,模块+软件源码都在压缩包内了,QQ协yi分析不容易,如果你觉得...

    USTB-计算机网络实践-WinPcap 实现ARP数据分组的发送和解析

    ②捕获网络中包含 ARP/ICMP/TCP 协议数据的数 180 据帧,解析协议数据的内容,并在标准输出中显示报文首部字段的内容,同 时写入日志文件。 • 以命令行或图形界面形式运行程序。 • 运行程序的同时开启 Wirshark 抓...

    Android Socket UDP通讯:手机对手机or手机对PC,点对点,or广播通讯,包含发送端,接收端-测试通过运用项目中

    Android Socket UDP通讯,发送端和接收端 手机对手机或者手机对PC端, 两种通讯方式:点对点,或者广播通讯

    Mobile_game_chess-Java_sc.rar_chess_手机移动通信_视频语音_象棋java网络

    系统介绍 从手机游戏依托的技术平台来看,目前Java手机游戏保持很高的增长速度。手机游戏将是未来游戏市场的主要发展方向,只要拥有一部手机,就可以进入到全新的掌上...向PC端开发靠拢,为以后PC与手机互联奠定基础

    Android DevCamp幻灯片分享:发现和建立多设备之间的数据通信 | 豌豆荚实验室 孙桥

    豌豆荚自行研发设计的 PMP 协议,并采用 Protobuf 等技术手段都很好的解决了不管是手机与手机还是手机与 PC 之间的通信问题。此次演讲豌豆实验室创始团队成员孙桥将以豌豆荚 PC 客户端对手机的管理及手机之间的分享...

    android手机网络聊天室

    本作品是完成android手机网络聊天室的设计,服务器开启后,客户端将绑定到本地的IP和端口,主要界面只有一个,以下是任务目标。 1)服务器端肯定要使用多线程技术 2)服务器端收到任何一个用户发来的消息肯定要转发...

    Android手机抓包相关工具

    tcpdump, Linux系统中普遍使用的一款开源网络协议分析工具,本版本适用于Android系统 adb.exe, 谷歌提供的安卓远程调试工具 read me.txt 使用说明(为了看起来更加格式清晰,请用最大化视图查看) ------------...

    iphone无线条形码二维码数据枪PC端 v1.0.zip

    可以通过http协议网络配合第三方软件其他的应用程序接口与您的手机上使用,可以使得软件得到无限扩展,可以简单的自定义操作指令并按照指令严谨的执行,从而能更方便快捷的协助各种办公应用 。

    云计算基础技术与应用-计算机网络.pdf

    云计算的最终使用者只要能够连接到网络,就可以 使用PC终端、手机终端、平板终端等各种终端形式使用云资源。 而云计算服务开发者也可以借助网络使用云计算的各类开发资源;云计算服务提 供商则通过网络开放云计算...

    云计算基础技术与应用-计算机网络.pptx

    云计算的最终使用者只要能够连接到网络,就可以使用PC终端、手机终端、平板终端等各种终端形式使用云资源。 而云计算服务开发者也可以借助网络使用云计算的各类开发资源;云计算服务提供商则通过网络开放云计算资源...

    charles 4.2.8 破解jar包 MAC可用

    Charles 是在 PC 端常用的网络封包截取工具,但它不仅仅能在pc端使用,还可以在手机ios和安卓端都可以使用。我们在做移动开发或者测试网页app时候,为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。...

Global site tag (gtag.js) - Google Analytics