一、添加权限

<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. Web APi入门之Self-Host寄宿及路由原理 【转载】

    前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知 ...

  2. taro 项目、代码说明

    入口文件的生命周期: 入口文件继承自 Component 组件基类,它同样拥有组件生命周期,但因为入口文件的特殊性,他的生命周期并不完整,如下 生命周期方法 作用 说明 componentWillMo ...

  3. SQL 更新修改删除一个表,库存自动增减的写法

    create trigger tri_asbon asb for insert as begin declare @rk int declare @ck int declare @sid varcha ...

  4. java小程序(课堂作业04)

    请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 1,设计思想: 先输入索要加密的字符串由于此程序比较基础所以只考虑大写字母,然后用toCharAr ...

  5. ubuntu-docker入门到放弃(四)容器的导入导出

    上一次我们讲了如何搭建自己私有的镜像管理仓库,实际上我们使用的依然是别人或者公共的image,今天就来说说如何将自己定制化的images上传到自己的私有仓库中,以供符合自己业务场景的项目来使用,如:我 ...

  6. Azure PowerShell (16) 并行开关机Azure ARM VM

    <Windows Azure Platform 系列文章目录> 并行开机脚本: https://github.com/leizhang1984/AzureChinaPowerShell/b ...

  7. Django与Vue交互,实现注册的图片验证码没有加载的原因

    注册功能之图片验证码: 1.实现过程: 传递uuid给后端,再发送图片验证码的请求给后端,后端存储uuid并生成图片验证码保存到redis,然后将图片验证码返回给前端. 当用户输入图片验证码的时候,前 ...

  8. IntelliJ IDEA maven springmvc+shiro简单项目

    搭建springmvc简单步骤如:http://www.cnblogs.com/grasp/p/9045242.html,这点就不在描述了. 新建和设置完工程的目录后,结构如下: pom.xml文件内 ...

  9. 64位系统VBS调用32位COM组件

    64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...

  10. IDC:IDC(互联网数据中心)

    ylbtech-IDC:IDC(互联网数据中心) IDC为互联网内容提供商(ICP).企业.媒体和各类网站提供大规模.高质量.安全可靠的专业化服务器托管.空间租用.网络批发带宽以及ASP.EC等业务. ...