学了不少基础的知识,拼一个完整点的小例子吧!
目标:完成一个与PC机互发消息的聊天程序。
首先要先试通,通讯机制。在多机互联中最常用的是网络,而网络编程中,底层的通讯机制也就是Socket。我们就想试一试用Socket来实现双机对联。先试通Socket通讯,PC机当服务器,手机当客户端。
通常,我们写PC的Socket程序时,了解到,服务器端是采用Socket监听程序来监听网络的某个端口,当客户端连入时,服务器监听程序返回一个Socket对象来收发消息。客户端要连接到服务器端时,需要知道对方的IP和端口。在本实例中,服务器端我们采用C#来实现。
C#服务端
l 监听服务:
IPAddress ip = IPAddress.Parse("127.0.0.1");
myList = new TcpListener(ip,8001); //8001为端口号
myList.Start();
l 开始监听:
TcpClient client = myList.AcceptTcpClient(); //程序将会卡住,是同步执行不是异步。一旦客户端接入时,创建对象,继续执行。
l 发送消息:
StreamWriter writer = new StreamWriter(client.GetStream());
writer.Write(Context + (char)13 + (char)10);
writer.Flush();
注意:在发送的消息内容中,结尾必须要加上回车换行。如是不加,Android中接收会出错(会报Bad package)。具体原来我也不清楚L
l 接收消息:
byte[] readBuffer = new byte[read_BUFFER_SIZE];
this.client.GetStream().BeginRead(readBuffer, 0, read_BUFFER_SIZE, new AsyncCallback(StreamReceiver), null);
int BytesRead = client.GetStream().EndRead(ar);
retString= Encoding.ASCII.GetString(readBuffer, 0, BytesRead - 1);
Android客户端
l 连接服务
Socket socket = new Socket("10.0.2.2", 8001);
在模拟器中,连接到PC端采用的IP是"10.0.2.2",端口用服务器端监听的端口。
l 发送消息
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
dos.write(str.getBytes());
l 接收消息
BufferedReader mReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"),8192);
String strRet = mReader.readLine(); //同样,执行读时,程序也会卡住,等待信息。
l 断开连接
socket.shutdownInput(); //需要调此方法,不然mReader.readLine还傻傻挂着。
socket.shutdownOutput();
socket.close();
在编写通讯程序时,由于读消息都是同步的,所以一般我们会采用线程来处理。
这章就写到这里,简单的通讯也就跑起来了,下次再把界面整得好看一点。
实例下载:MyTalk.rar