socket编程实例(包含线程的和线程间的通信的使用)

本文转自:http://blog.csdn.net/x605940745/article/details/17001641

注意点:注册访问的网络权限;android中UI线程不能有访问网络的操作,否则会报android.os.NetworkOnMainThreadException的异常

[html] view plaincopy

  1. <uses-permission
  2. android:name="android.permission.INTERNET"/>

实例一

客户端

[java] view plaincopy

  1. package com.android.xiong.simplesocket;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.InetSocketAddress;
  7. import java.net.Socket;
  8. import java.net.SocketTimeoutException;
  9. import android.app.Activity;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.view.Menu;
  14. import android.view.View;
  15. import android.view.View.OnClickListener;
  16. import android.widget.Button;
  17. import android.widget.EditText;
  18. import android.widget.TextView;
  19. public class MainActivity extends Activity {
  20. Socket socket = null;
  21. String buffer = "";
  22. TextView txt1;
  23. Button send;
  24. EditText ed1;
  25. String geted1;
  26. public Handler myHandler = new Handler() {
  27. @Override
  28. public void handleMessage(Message msg) {
  29. if (msg.what == 0x11) {
  30. Bundle bundle = msg.getData();
  31. txt1.append("server:"+bundle.getString("msg")+"\n");
  32. }
  33. }
  34. };
  35. @Override
  36. protected void onCreate(Bundle savedInstanceState) {
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_main);
  39. txt1 = (TextView) findViewById(R.id.txt1);
  40. send = (Button) findViewById(R.id.send);
  41. ed1 = (EditText) findViewById(R.id.ed1);
  42. send.setOnClickListener(new OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. geted1 = ed1.getText().toString();
  46. txt1.append("client:"+geted1+"\n");
  47. //启动线程 向服务器发送和接收信息
  48. new MyThread(geted1).start();
  49. }
  50. });
  51. }
  52. class MyThread extends Thread {
  53. public String txt1;
  54. public MyThread(String str) {
  55. txt1 = str;
  56. }
  57. @Override
  58. public void run() {
  59. //定义消息
  60. Message msg = new Message();
  61. msg.what = 0x11;
  62. Bundle bundle = new Bundle();
  63. bundle.clear();
  64. try {
  65. //连接服务器 并设置连接超时为5秒
  66. socket = new Socket();
  67. socket.connect(new InetSocketAddress("1.1.9.30", 30000), 5000);
  68. //获取输入输出流
  69. OutputStream ou = socket.getOutputStream();
  70. BufferedReader bff = new BufferedReader(new InputStreamReader(
  71. socket.getInputStream()));
  72. //读取发来服务器信息
  73. String line = null;
  74. buffer="";
  75. while ((line = bff.readLine()) != null) {
  76. buffer = line + buffer;
  77. }
  78. //向服务器发送信息
  79. ou.write("android 客户端".getBytes("gbk"));
  80. ou.flush();
  81. bundle.putString("msg", buffer.toString());
  82. msg.setData(bundle);
  83. //发送消息 修改UI线程中的组件
  84. myHandler.sendMessage(msg);
  85. //关闭各种输入输出流
  86. bff.close();
  87. ou.close();
  88. socket.close();
  89. } catch (SocketTimeoutException aa) {
  90. //连接超时 在UI界面显示消息
  91. bundle.putString("msg", "服务器连接失败!请检查网络是否打开");
  92. msg.setData(bundle);
  93. //发送消息 修改UI线程中的组件
  94. myHandler.sendMessage(msg);
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. @Override
  101. public boolean onCreateOptionsMenu(Menu menu) {
  102. // Inflate the menu; this adds items to the action bar if it is present.
  103. getMenuInflater().inflate(R.menu.main, menu);
  104. return true;
  105. }
  106. }

[html] view plaincopy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <EditText
  11. android:id="@+id/ed1"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:hint="给服务器发送信息"/>
  15. <Button
  16. android:id="@+id/send"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_below="@id/ed1"
  20. android:text="发送"/>
  21. <TextView
  22. android:id="@+id/txt1"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/send"/>
  26. </RelativeLayout>

服务端

[java] view plaincopy

  1. package com.android.net;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class AndroidService {
  8. public static void main(String[] args) throws IOException {
  9. ServerSocket serivce = new ServerSocket(30000);
  10. while (true) {
  11. //等待客户端连接
  12. Socket socket = serivce.accept();
  13. new Thread(new AndroidRunable(socket)).start();
  14. }
  15. }
  16. }

[java] view plaincopy

  1. package com.android.net;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.io.OutputStreamWriter;
  9. import java.io.PrintWriter;
  10. import java.net.Socket;
  11. public class AndroidRunable implements Runnable {
  12. Socket socket = null;
  13. public AndroidRunable(Socket socket) {
  14. this.socket = socket;
  15. }
  16. @Override
  17. public void run() {
  18. // 向android客户端输出hello worild
  19. String line = null;
  20. InputStream input;
  21. OutputStream output;
  22. String str = "hello world!";
  23. try {
  24. //向客户端发送信息
  25. output = socket.getOutputStream();
  26. input = socket.getInputStream();
  27. BufferedReader bff = new BufferedReader(
  28. new InputStreamReader(input));
  29. output.write(str.getBytes("gbk"));
  30. output.flush();
  31. //半关闭socket
  32. socket.shutdownOutput();
  33. //获取客户端的信息
  34. while ((line = bff.readLine()) != null) {
  35. System.out.print(line);
  36. }
  37. //关闭输入输出流
  38. output.close();
  39. bff.close();
  40. input.close();
  41. socket.close();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

实例二

客户端

[java] view plaincopy

  1. package com.android.xiong.sockettwotest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.TextView;
  12. public class MainActivity extends Activity {
  13. // 定义界面上的两个文本框
  14. EditText input;
  15. TextView show;
  16. // 定义界面上的一个按钮
  17. Button send;
  18. Handler handler;
  19. // 定义与服务器通信的子线程
  20. ClientThread clientThread;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. input = (EditText) findViewById(R.id.input);
  26. show = (TextView) findViewById(R.id.show);
  27. send = (Button) findViewById(R.id.send);
  28. handler = new Handler() {
  29. @Override
  30. public void handleMessage(Message msg) {
  31. // 如果消息来自子线程
  32. if (msg.what == 0x123) {
  33. // 将读取的内容追加显示在文本框中
  34. show.append("\n" + msg.obj.toString());
  35. }
  36. }
  37. };
  38. clientThread = new ClientThread(handler);
  39. // 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
  40. new Thread(clientThread).start();
  41. send.setOnClickListener(new OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. try {
  45. // 当用户按下按钮之后,将用户输入的数据封装成Message
  46. // 然后发送给子线程Handler
  47. Message msg = new Message();
  48. msg.what = 0x345;
  49. msg.obj = input.getText().toString();
  50. clientThread.revHandler.sendMessage(msg);
  51. input.setText("");
  52. } catch (Exception e) {
  53. }
  54. }
  55. });
  56. }
  57. @Override
  58. public boolean onCreateOptionsMenu(Menu menu) {
  59. getMenuInflater().inflate(R.menu.main, menu);
  60. return true;
  61. }
  62. }

[java] view plaincopy

  1. package com.android.xiong.sockettwotest;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.InetSocketAddress;
  7. import java.net.Socket;
  8. import java.net.SocketTimeoutException;
  9. import android.os.Handler;
  10. import android.os.Looper;
  11. import android.os.Message;
  12. public class ClientThread implements Runnable {
  13. private Socket s;
  14. // 定义向UI线程发送消息的Handler对象
  15. Handler handler;
  16. // 定义接收UI线程的Handler对象
  17. Handler revHandler;
  18. // 该线程处理Socket所对用的输入输出流
  19. BufferedReader br = null;
  20. OutputStream os = null;
  21. public ClientThread(Handler handler) {
  22. this.handler = handler;
  23. }
  24. @Override
  25. public void run() {
  26. s = new Socket();
  27. try {
  28. s.connect(new InetSocketAddress("1.1.9.30", 3000), 5000);
  29. br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  30. os = s.getOutputStream();
  31. // 启动一条子线程来读取服务器相应的数据
  32. new Thread() {
  33. @Override
  34. public void run() {
  35. String content = null;
  36. // 不断的读取Socket输入流的内容
  37. try {
  38. while ((content = br.readLine()) != null) {
  39. // 每当读取到来自服务器的数据之后,发送的消息通知程序
  40. // 界面显示该数据
  41. Message msg = new Message();
  42. msg.what = 0x123;
  43. msg.obj = content;
  44. handler.sendMessage(msg);
  45. }
  46. } catch (IOException io) {
  47. io.printStackTrace();
  48. }
  49. }
  50. }.start();
  51. // 为当前线程初始化Looper
  52. Looper.prepare();
  53. // 创建revHandler对象
  54. revHandler = new Handler() {
  55. @Override
  56. public void handleMessage(Message msg) {
  57. // 接收到UI线程的中用户输入的数据
  58. if (msg.what == 0x345) {
  59. // 将用户在文本框输入的内容写入网络
  60. try {
  61. os.write((msg.obj.toString() + "\r\n")
  62. .getBytes("gbk"));
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
  68. };
  69. // 启动Looper
  70. Looper.loop();
  71. } catch (SocketTimeoutException e) {
  72. Message msg = new Message();
  73. msg.what = 0x123;
  74. msg.obj = "网络连接超时!";
  75. handler.sendMessage(msg);
  76. } catch (IOException io) {
  77. io.printStackTrace();
  78. }
  79. }
  80. }

[html] view plaincopy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <EditText
  11. android:id="@+id/input"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:hint="@string/input" />
  15. <Button
  16. android:id="@+id/send"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:text="@string/send"
  20. android:layout_below="@id/input"/>
  21. <TextView
  22. android:id="@+id/show"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/send"/>
  26. </RelativeLayout>

服务端

[java] view plaincopy

  1. package com.android.net;
  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. public class MyService {
  8. // 定义保存所有的Socket
  9. public static List<Socket> socketList = new ArrayList<Socket>();
  10. public static void main(String[] args) throws IOException {
  11. ServerSocket server = new ServerSocket(3000);
  12. while(true){
  13. Socket s=server.accept();
  14. socketList.add(s);
  15. //每当客户端连接之后启动一条ServerThread线程为该客户端服务
  16. new Thread(new ServiceThreada(s)).start();
  17. }
  18. }
  19. }

[java] view plaincopy

    1. package com.android.net;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.io.OutputStream;
    6. import java.net.Socket;
    7. public class ServiceThreada implements Runnable {
    8. // 定义当前线程处理的Socket
    9. Socket s = null;
    10. // 该线程所处理的Socket所对应的输入流
    11. BufferedReader br = null;
    12. public ServiceThreada(Socket s) {
    13. this.s = s;
    14. try {
    15. br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    16. } catch (IOException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. @Override
    21. public void run() {
    22. String content = null;
    23. //采用循环不断的从Socket中读取客户端发送过来的数据
    24. while((content=readFromClient())!=null){
    25. //遍历socketList中的每个Socket
    26. //将读取到的内容每个向Socket发送一次
    27. for(Socket s:MyService.socketList){
    28. OutputStream os;
    29. try {
    30. os = s.getOutputStream();
    31. os.write((content+"\n").getBytes("gbk"));
    32. } catch (IOException e) {
    33. // TODO Auto-generated catch block
    34. e.printStackTrace();
    35. }
    36. }
    37. }
    38. }
    39. // 定义读取客户端的信息
    40. public String readFromClient() {
    41. try {
    42. return br.readLine();
    43. } catch (Exception e) {
    44. e.printStackTrace();
    45. }
    46. return null;
    47. }
    48. }
时间: 2024-08-25 13:32:45

socket编程实例(包含线程的和线程间的通信的使用)的相关文章

socket 编程实例

1.socket编程 软件测试并jmeter为的是实现客户端并发,jmeter 的原理是使用线程池, 而软件开发的目的是为实现服务端的并发支持多用户同时并发工作 2. 基于多线程实现套接字服务端实现并发 客户端: '''客户端只要单用户循环通信'''import socketclient = socket.socket()client.connect(('127.0.0.1',8090))while True: client.send('33'.encode('utf-8')) data = c

TCP/UDP套接字 java socket编程实例

网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. HTTP协议和Socket的区别 http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应.传输的数据是原始格式的数据,eg :json.xml.text等数据格式. socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数

android之socket编程实例

sokcet 编程实例 android bundle类

C# 子线程与主线程之间的通信

先说明一下,本人最近遇到了什么问题,就是在写写消息队列的时候,发现消息队列每次接收一个消息的时候都是创建了一个新的线程.这样就导致了消息处理的时候没有在主线程上进行,然而其中的一些步事项是要通过主线程才能操作的.这样就引出了一个子线程怎么去通知主线程要做哪些事情呢? 为了解决上面的问题我找了好的多资料,好多都是用委托,去解决了,然后我又看了我的项目通过这种beginInvoker的这种办法解决不是很好用.并不能解决的当前的问题,在这个时候我发现了SynchronizationContext对象.

Java学习(六):Socket编程实例

Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. Java已经简化了Socket的编程接口.Java提供了ServerSocket来对其进行支持.事实上当创建该类的一个实例对象并提供一个端口资源,就建立了一个固定位置可以让其他计算机来访问了,如:ServerSocket server=new ServerSocket(6789);       这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.

网络编程之socket编程实例

简单实例1 server.c 1 #include <sys/types.h> 2 #include <sys/socket.h> // 包含套接字函数库 3 #include <stdio.h> 4 #include <netinet/in.h> // 包含AF_INET相关结构 5 #include <arpa/inet.h> // 包含AF_INET相关操作的函数 6 #include <unistd.h> 7 #include

java socket编程实例代码讲解

1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 操作java socket时用到的最多的三个方法为: accept():主要用于服务器端产生"阻塞",等待客户端的链接请求,并且返回一个客户端的Socket实例: getInputStream():方法主要用来获得网络连接输入,同时返回一个InputStream对象实例: getOutputStream

NIO Socket编程实例

NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java

如何为可扩展系统进行Java Socket编程

从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket和Windows WinSock代码.我的任务是确保视频游戏客户端和一个游戏服务器通信.很幸运有这样的机会写一些Java Socket代码,我对Java流式网络编程和简洁明了的API着迷.这一点都不让人惊讶,Java最初就是设计促进智能设备之间的通信,这一点很好的转移到了桌面应用和服务器应用. 19