转载http://www.eoeandroid.com/thread-97477-1-1.html

小知识点:UDP协议和TCP协议的不同。UDP是把数据都打成数据包,数据包上自带通信的地址,但是数据包发出去之后UDP协议不能保证你能否收到。而TCP协议要求接收方收到数据后给个回应,当发送重要数据的时候就可以选择TCP协议。UDP发送数据的量是有限的,而TCP是没有限制的,当然这导致UDP很快,TCP相对慢点。根据不同的情况,有不同的选择。TCP能保证数据传输的成功性,UDP只传输,不保证传输的正确性。

一、通信的基本结构:客户端和服务器端

客户端这边是Socket类:客户端指定给某个服务器端上的某个端口发送消息。比如向56.152.16.5这台机器的19001号端口发送消息。
服务器端是ServiceSocket类:服务器端就在19001号这个端口上监听,一旦有消息来立刻捕捉还可以有所回应。
客户端通过OutputStream向服务器端发送数据,服务器端通过InputStream获取数据,即OutputStream(发)——>InputStream(收)。以字节流的方式获取数据。

如果服务器端想回发消息也是同样的道理。

二、实例讲解编写服务器端和客户端
1. 服务器端:这是个纯java的project,单独在一个工程。

01.import java.io.BufferedReader;
02.import java.io.IOException;
03.import java.io.InputStreamReader;
04.import java.net.ServerSocket;
05.import java.net.Socket;
06.
07.public class ServerSocketText {
08.
09. public static void main(String[] args) {
10. new ServerThread().start();
11.
12. }
13.
14.}
15. 16.// 创建一个线程在后台监听
17.class ServerThread extends Thread {
18. private static int Port = 19001;
19. ServerSocket serversocket = null;
20. 21. public void run() {
22. 23. try {
24. // 创建一个serversocket对象,并让他在Port端口监听
25. serversocket = new ServerSocket(Port);
26. while (true) {
27. // 调用serversocket的accept()方法,接收客户端发送的请求
28. Socket socket = serversocket.accept();
29. BufferedReader buffer = new BufferedReader(
30. new InputStreamReader(socket.getInputStream()));
31. // 读取数据
32. String msg = buffer.readLine();
33. System.out.println("msg:" + msg);
34. }
35. 36. } catch (IOException e) {
37. e.printStackTrace();
38. } finally {
39. try {
40. serversocket.close();
41. } catch (IOException e) {
42. e.printStackTrace();
43. }
44. }
45. }
46.}

2. 客户端:这是个android的客户端,用于发送消息。

01.import java.io.BufferedWriter;
02.import java.io.IOException;
03.import java.io.OutputStreamWriter;
04.import java.io.PrintWriter;
05.import java.net.InetAddress;
06.import java.net.NetworkInterface;
07.import java.net.Socket;
08.import java.net.SocketException;
09.import java.net.UnknownHostException;
10.import java.util.Enumeration;
11.
12.import android.app.Activity;
13.import android.os.Bundle;
14.import android.util.Log;
15.import android.view.View;
16.import android.view.View.OnClickListener;
17.import android.widget.Button;
18.import android.widget.EditText;
19.
20.public class Client extends Activity {
21. private static String IpAddress = "56.152.16.5";
22. private static int Port = 10000;
23. private EditText edittext = null;
24. private Button send = null;
25. Socket socket = null;
26.
27. @Override
28. public void onCreate(Bundle savedInstanceState) {
29. super.onCreate(savedInstanceState);
30. setContentView(R.layout.main);
31. edittext = (EditText) findViewById(R.id.edittext);
32. send = (Button) findViewById(R.id.send);
33. send.setOnClickListener(new OnClickListener() {
34.
35. @Override
36. public void onClick(View v) {
37. sendMsg();
38.
39. }
40. });
41. }
42.
43. // 发送信息
44. public void sendMsg() {
45.
46. try {
47. // 创建socket对象,指定服务器端地址和端口号
48. socket = new Socket(IpAddress, Port);
49. // 获取 Client 端的输出流
50. PrintWriter out = new PrintWriter(new BufferedWriter(
51. new OutputStreamWriter(socket.getOutputStream())), true);
52. // 填充信息
53. out.println(edittext.getText());
54. System.out.println("msg=" + edittext.getText());
55. // 关闭
56.
57. } catch (UnknownHostException e1) {
58. e1.printStackTrace();
59. } catch (IOException e1) {
60. e1.printStackTrace();
61. } finally {
62. try {
63. socket.close();
64. } catch (IOException e) {
65. e.printStackTrace();
66. }
67. }
68.
69. }
70.}

3. 注意事项:
记得在AndroidManifest.xml中添加你的网络权限
<uses-permission android:name="android.permission.INTERNET"/>
activity布局就是一个edittext和已个button,所以没贴出代码。

运行时最好先android在服务器端,这样客户端发消息时才方便查看。

4. 疑问:

既然本例中socket建立的是TCP连接,那么客户端发完数据后socket关闭,服务器端socket也应该关闭,也就是不能再继续监听了,是这样吗?可能是,服务器的一个主线程在10000口监听,接受到一个客户端的请求则建立连接,并将该连接分配给一个线程,后主线程继续监听其他线程的请求。分配的线程接过连接大棒,与客户端交互。一旦客户端关闭连接,则该线程也关闭连接,结束。

android网络编程_socket(一)的更多相关文章

  1. Android网络编程只局域网传输文件

    Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...

  2. Android网络编程基础

    Android网络编程只TCP通信 TCP 服务器端工作的主要步骤如下.步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上.步骤2 调用acc ...

  3. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  4. Android网络编程系列 一 Socket抽象层

     在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...

  5. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...

  6. Android网络编程概述

    Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...

  7. Android网络编程http派/申请服务

    最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...

  8. 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

    请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...

  9. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

随机推荐

  1. Simple BeamSearch Codes for Python

    Code from: https://github.com/SeitaroShinagawa/simple_beamsearch probs = [[[],[0.3,0.7]], [[0],[0.1, ...

  2. Delphi 7学习开发控件(继承TGraphicControl只画一条线)

    我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序.在此不特别介绍一些概念,只记录自己学习开发控件的步骤.假 ...

  3. delphi 在多线程中使用 CreateOleObject 导致失败(一定要使用CoInitialize和CoUninitialize,举例查询WMI)

    原帖地址 http://bbs.csdn.net/topics/390481350 解决办法 procedure DisplayVideoInfo; var wmi, objs, obj : OleV ...

  4. ACL 我为什么要发明一个轮子?

    现在成熟的开发库与开发框架有很多,所以平时我们在开发自己的应用程序时一般直接拿来用就可以了,所以当我先是开发出 C 语言版的 acl 框架库时有人认为是这个轮子是否值得发明,而当我再开发出基于 acl ...

  5. Qt按ESC关闭模态对话框不触发closeEvent()问题解析(ESC默认调用的是reject()函数,所以必须覆盖这个函数才会有效果)good

    事情是这样的:今天调试窗体,突然发现按ESC键居然跳过closeEvent()关闭了对话框!我的关闭判断都在closeEvent()里,这直接导致非正常关闭了正在进行的工作.先重建下场景: 调用处: ...

  6. kafka笔记1

    Kafka是一款基于发布和订阅的消息系统.一般被称为分布式提交日志或分布式流平台. Kafka系统是按照一定的顺序持久化保存的,可以按需读取. Kafka的数据单元被称为消息.类似于数据库中表的一行记 ...

  7. mysql查询类型转换问题

    mysql转换类型.类型转换.查询结果类型转换 一.问题来源 数据库一张表的主键id设为了自增,那就是int型的,但是其他表的关联字段又设置成了字符串! 而且已经开发了很久才发现问题,既然出现了问题肯 ...

  8. hgoi#20190628

    更好的阅读体验 来我的博客观看 T1-打印收费 CZYZ 校园内有一家打印店,收费有着奇葩的规则,对于打印的量不同的情况会收取不同的费用.例如打印少于 100 张的时候,收取 20 分每张,但是打印不 ...

  9. 浅入深出Vue:数据渲染

    今天来正式开始 vue的学习,首当其冲的当然是数据的渲染.毕竟数据就是拿来看的,看看如果使用 vue来展示数据. 为什么渲染 俗话说 "人靠衣装马靠鞍", 那咱们的代码就是得靠 U ...

  10. JavaWeb入门_模仿天猫整站Tmall_SSM实践项目

    Tmall_SSM 技术栈 Spring MVC+ Mybatis + Spring + Jsp + Tomcat , 是 Java Web 入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后 ...