一、添加权限

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

二、输入输出流

客户端和服务器端的输入输出流的问题容易搞混淆:如下图

在客户端:

socket.getInputStream();从socket读来自服务器的数据

socket.getOutputStream();向socket中写数据,传给服务器,服务器在它的socket的输入流读这个数据

在服务器端:

socket.getInputStream();从socket读来自客户端的数据

socket.getOutputStream();向socket中写数据,传给客户端,客户端在它的socket的输入流读这个数据

就是说客户端和服务器端的输入输出流是对应的,输入流连接到输出流 

输入输出流的包装:

方法一:数据二进制流

DataInputStream in=new DataInputStream(socket.getInputStream());//接收客户端信息
DataOutputStream out=new DataOutputStream(socket.getOutputStream()); //向客户端发送消息

方法二:

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

三、客户端/服务器端实现

创建服务器端的步骤
1,指定端口实例化一个ServerSocket

2,调用ServerSocket的accept方法等待连接期间阻塞

3,获取位于底层的Socket流进行读写操作

4,将数据封装成流

5,对Socket进行读写

6,关闭流

创建客户端的步骤:

1,通过IP地址和端口实例化Socket,请求连接服务器

2,获取位于底层的Socket流进行读写操作

3,将数据封装成流(BufferedReader/PrintWriter,DataOutputStream/DataInputStream)的实例

4,对Socket进行读写

5,关闭流

socketClient,java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class socketClient extends Activity {
private Button button;
private TextView text;
private EditText edit; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.button);
edit = (EditText) findViewById(R.id.edit);
text = (TextView) findViewById(R.id.text); button.setOnClickListener(new View.OnClickListener() {
private Socket socket = null; @Override
public void onClick(View v) {
// TODO Auto-generated method stub String sendMsg = edit.getText().toString() + "\r\n"; try {
socket = new Socket("192.168.0.37", 8888); // 创建Socket,其中ip地址为我的PC机器的地址,手机通过wifi上网和服务器在一个网段 // PrintWriter out = new PrintWriter(new BufferedWriter(new
// OutputStreamWriter(socket.getOutputStream())),true);
// out.println(sendMsg);
//
// BufferedReader in = new BufferedReader(new
// InputStreamReader(socket.getInputStream()));
// String readMsg = in.readLine();
// if(readMsg !=null){
// text.setText(readMsg);
// }else{
// text.setText("错误");
// }
//
// out.close();
// in.close();
// socket.close(); DataOutputStream out = new DataOutputStream(socket
.getOutputStream()); // 向服务器发送消息
out.writeUTF(sendMsg);
out.flush(); DataInputStream in = new DataInputStream(socket
.getInputStream()); // 接收来自服务器的消息
String readMsg = in.readUTF();
if (readMsg != null) {
text.setText(readMsg);
}
out.close();
in.close();
socket.close(); } catch (Exception e) {
e.printStackTrace();
}
}
});
}
}

Server.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
public Server(){
new ServerThread().start();
}
class ServerThread extends Thread{
public void run() {
try {
ServerSocket ss=new ServerSocket(8888); ////创建一个ServerSocket对象,并让这个ServerSocket在8888端口监听
while(true){
Socket socket=ss.accept(); //调用ServerSocket的accept()方法,接受客户端所发送的请求,如果客户端没有发送数据,那么该线程就停滞不继续
// try {
// BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //接收客户端信息
// String readline = in.readLine();
// System.out.println("readline:"+readline);
//
// PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
// out.println("link server success");
//
// in.close(); //关闭流
// out.close();//关闭流
// socket.close();//关闭打开的socket
//
// } catch (Exception e) {
// // TODO: handle exception
// }finally{
// // socket.close();//
// }
try {
DataInputStream in=new DataInputStream(socket.getInputStream());//接收客户端信息
String readline=in.readUTF();
System.out.println(readline); DataOutputStream out=new DataOutputStream(socket.getOutputStream()); //向客户端发送消息
out.writeUTF("link server success");
out.flush(); in.close(); //关闭流
out.close();//关闭流
socket.close();//关闭打开的socket } catch (Exception e) {
System.out.println(e.getMessage());
}
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
public static void main(String[] args) throws IOException {
new Server(); //开启服务器
} }

  

  

Android之socket多线程的更多相关文章

  1. Android之socket多线程(二)

    使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...

  2. Android中的多线程【转】

    感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...

  3. android 通过socket获取IP

    如题<android 通过socket获取IP>: socket.getInetAddress().getHostAddress();

  4. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  5. Android 之 Socket 通信

    Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...

  6. Android Learning:多线程与异步消息处理机制

    在最近学习Android项目源码的过程中,遇到了很多多线程以及异步消息处理的机制.由于之前对这块的知识只是浅尝辄止,并没有系统的理解.但是工程中反复出现让我意识到这个知识的重要性.所以我整理出这篇博客 ...

  7. 基于android的Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...

  8. Android四个多线程分析:MessageQueue实现

    Android四个多线程分析:MessageQueue的实现 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线 ...

  9. java socket 多线程网络传输多个文件

    http://blog.csdn.net/njchenyi/article/details/9072845 java socket 多线程网络传输多个文件 2013-06-10 21:26 3596人 ...

随机推荐

  1. microcks 微服务mocks 工具&&运行时

    microcks 是一个方便的微服务mock 工具,我们可以用来mock request.response,同时获取api 的服务契约,microcks 支持的部署模式也比较多,docker-comp ...

  2. Hasura GraphQL 内部表结构

    Hasura 使用pg 数据库存储引擎的元数据信息,在hdb_catalog schema 下面,是在初始化的时候生成的 对于表的管理.权限的信息存储都在这个schema下 hdb_table 这个表 ...

  3. java自学总结

    经过了一段时间的java学习,感觉自己在编程方面还只是一个初学者,感觉学会了c,在学c++的时候就是以c为基础,java应该也是以c或者c++为基础,但是并非如此,java和c++虽然有一些相似之处, ...

  4. KiCad 如何在原理图添加元件时看到 PCB 封装?

    KiCad 如何在原理图添加元件时看到 PCB 封装? 这个功能默认是关闭,评估关闭的原因是因为 PCB 封装很大,而且在前期也没必要详细知道 PCB 封装. 但是有时修改可以看到 PCB 封装会方便 ...

  5. ML(2)——感知器

    感知器(PLA——Perceptron Learning Algorithm),也叫感知机,处理的是机器学习中的分类问题,通过学习得到感知器模型来对新实例进行预测,因此属于判别模型.感知器于1957年 ...

  6. java自动装箱的一个例子

    Object obj = 56; int i = (Integer)obj; 第一行等价于: Object obj = Integer.valueOf(56);      Integer.valueO ...

  7. 使用openssl命令剖析RSA私钥文件格式

    原文 https://blog.csdn.net/zhymax/article/details/7683925 Openssl提供了强大证书功能,生成密钥对.证书,颁发证书.生成crl.验证证书.销毁 ...

  8. Eclipse各个版本及其对应代号、下载地址列表

    版本号 代码 日期 下载地址 Eclipse 3.1 IO[木卫一,伊奥] 2005 http://archive.eclipse.org/eclipse/downloads/drops/R-3.1- ...

  9. socket 断线重连

    send发送数据时,发送失败,进行如下重连处理: ) < )//serbuf中有数据可以发送才会执行这条语句 { printf("serial to tcp send msg erro ...

  10. [转]jsPlumb插件做一个模仿viso的可拖拉流程图

    原贴:https://www.cnblogs.com/sggx/p/3836432.html 前言 这是我第一次写博客,心情还是有点小小的激动!这次主要分享的是用jsPlumb,做一个可以给用户自定义 ...