今天做了一个多线程的例子,多个Android手机和电脑通信。
首先要说的时候 我的一个理解误区,也是我最大的收获。
先说一下socket,比如
while(true){
Socket sc=ServerSocker.accept();
}
我一直以为这个阻塞是自己的while循环产生的,后来差资料发现,accept()方法自己产生阻塞,
也就说 进入while循环以后,代码会停在 Socket sc=ServerSocker.accept();这一行,知道有链接请求,才会进入下一个循环,继续等待连接,在那里阻塞。 这个while 循环是为了多个客户端链接,每一个链接都会得到一个Socket实例,用这个实例与客户端通讯,
这就需要自己开辟进程,进行处理了。语文学的不好,贴出代码来
java程序
package com.bh;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server{
/**
* @param args
*/
int i=0;
private static ServerSocket mServerSocker;
private static Socket sc;
// private static BufferedReader in;
// private static PrintWriter out;
public static void main(String[] args) throws IOException {
mServerSocker=new ServerSocket(8888);
while(true){
sc=mServerSocker.accept();
System.out.println("aaaaaaaa");
//Server s=new Server();
Thread r=new ReciveThreat(sc);
r.start();
Thread s=new SendThread(sc);
s.start();
System.out.println("kaishi");
//my.run();
//new Server().run();
}
//out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true);
}
}
send类
package com.bh;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class SendThread extends Thread{
private Socket sc;
int i=0;
//private BufferedReader in;
private PrintWriter out;
public SendThread(Socket s) throws IOException {
sc=s;
//in=new BufferedReader(new InputStreamReader(sc.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true);
//System.out.println("ok");
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true){
Thread.sleep(3000);
System.out.println("aa");
out.println(i++);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
recive类
package com.bh;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class ReciveThreat extends Thread{
private Socket sc;
private BufferedReader in;
//private PrintWriter out;
public ReciveThreat(Socket s) throws IOException {
sc=s;
in=new BufferedReader(new InputStreamReader(sc.getInputStream()));
//out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())),true);
}
@Override
public void run() {
while(true){
try {
String str;
str = in.readLine();
if(str!=null){
System.out.println("read:"+str);
System.out.println("run......");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Android程序
package com.bh.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Main extends Activity implements Runnable{
/** Called when the activity is first created. */
EditText et;
String recive;
Socket s;
TextView t;
PrintWriter out;
BufferedReader in;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et=(EditText) findViewById(R.id.edittext);
Button b=(Button) findViewById(R.id.send);
t=(TextView) findViewById(R.id.showtext);
try {
s = new Socket("10.0.2.2",8888);
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
in=new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new Thread(this).start();
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String aa=et.getText().toString();
out.println(aa);
//s.close();
Log.d("aaaaaaa", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
});
}
public Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
t.setText(recive);
break;
default:
break;
}
};
};
@Override
public void run() {
while(true){
try {
//String str;
recive = in.readLine();
Log.d("aaaaa",recive);
if(recive!=null){
//t.setText(recive);
handler.sendEmptyMessage(1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
有错误 大家指出了 谢谢哈
分享到:
相关推荐
以下是关于Android与PC机Socket多线程通信的关键知识点: 1. **Socket基础**:Socket是网络通信中的一个概念,它代表了两台机器间的一个连接端点,允许数据在网络中传输。在Java中,Socket类和ServerSocket类提供了...
本项目"android socket局域网文件传输131114"是针对这一需求实现的一个示例,它利用了Socket、多线程以及ListView等Android核心组件,旨在提供一种高效、稳定、用户友好的文件共享解决方案。 首先,Socket作为TCP/...
Java Android Socket 编程是Android应用开发中用于实现设备间通信的重要技术,它基于TCP...开发者在实际应用中需要根据具体需求,考虑如何处理数据传输、错误恢复、多线程和安全问题等,以实现稳定、高效且安全的通信。
在Java或其他支持多线程的编程语言中,多线程允许程序同时执行多个任务。这样可以提高应用程序的效率和响应性,特别是在处理I/O操作或并发用户请求时。在服务器端,多线程技术常用于处理来自多个客户端的并发连接,...
总结来说,`Android-Lemon`作为一个轻量级的Android Socket框架,大大简化了开发者在Android平台上进行Socket通信的工作,提高了开发效率。其易用性和灵活性使得它成为Android网络编程中值得推荐的工具。通过理解其...
总结来说,Android中的Socket通信涉及网络编程、多线程、数据处理等多个方面,需要综合运用Java和Android的相关知识。理解并熟练掌握Socket通信,对于开发实时交互的应用,如聊天、游戏等,至关重要。通过实践和不断...
总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端”涉及了网络编程的多个关键点,包括Socket的创建和管理、心跳包的设计和处理、消息的异步回调以及服务端的并发处理。通过理论学习和实际项目的实践,...
在实际应用中,我们还需要考虑异常处理、多线程处理并发连接等问题。同时,Android有权限管理,所以在AndroidManifest.xml中需要添加Internet权限: ```xml <uses-permission android:name="android.permission....
在Android平台上,Socket服务端的实现是通过Java的Socket编程...总之,Android Socket服务端的实现涉及网络编程基础、多线程处理、服务生命周期管理等多个方面,理解和掌握这些知识点对于构建实时通信的应用至关重要。
3. **创建Socket客户端(AndroidSocket)** - 客户端也需要创建Socket对象,通过调用Socket类的构造函数,指定服务器的IP地址和端口号来建立连接。 - 连接建立后,同样使用Socket的InputStream和OutputStream进行...
实际应用中可能需要考虑异常处理、数据编码解码、多线程等问题,以确保通信的稳定性和安全性。同时,为了优化性能,可以考虑使用异步编程模型,如.NET中的async/await关键字,以及Android的AsyncTask或Handler机制。...
总之,"Android socket即时通信"是一个涵盖了网络编程、多线程、异步处理等核心概念的实际应用案例,对于Android开发者来说,理解和掌握这一技术对于开发实时通信应用至关重要。通过分析提供的源代码和实践操作,...
总之,Android Socket服务器端开发涉及到Java网络编程、多线程、权限管理等多个方面,对于实现设备间的实时通信有着重要作用。通过上述步骤,你可以创建一个基础的Android Socket服务器,然后根据具体需求扩展功能,...
4. **多线程处理**: - 当多个客户端同时连接服务器时,为了不让服务器阻塞在`accept()`方法,通常会为每个连接创建一个新的线程来处理。这样,服务器可以同时处理多个客户端的请求,提高并发性能。 5. **断开连接...
总之,Android的Socket文件传输涉及网络编程、文件操作和多线程等技术,通过合理的优化策略,即使是大文件也能流畅地进行传输。在实际项目中,开发者需要根据需求进行定制,以满足特定的性能和安全要求。
总结来说,实现"android socket实时传输到服务端"需要掌握以下关键技术: 1. Android的Camera API,用于访问和控制摄像头。 2. Java Socket编程,建立客户端和服务器之间的通信。 3. MediaCodec API,进行视频编码以...
在Android平台上,Socket通信是一种常见的网络编程方式,用于设备间的双向数据传输。Socket提供了一种可靠的、基于连接的...实际开发中,可能还需要考虑多线程处理、断点续传、进度显示等功能,以提供更好的用户体验。
在Android中,我们通常使用java.net.Socket类来创建和管理Socket。Socket基于TCP/IP协议,确保数据的可靠传输,通过IP地址和端口号定位到网络上的特定进程。 二、Android Socket客户端 1. 创建Socket对象:客户端...
总结来说,这个“android Socket通信源代码”项目为初学者提供了Android平台下使用Socket进行客户端-服务器通信的基础示例,涵盖了Socket通信的基本概念和操作。通过学习和实践,开发者能够掌握Android网络编程的...
总的来说,这个项目涵盖了Android应用开发中的多个关键知识点,如Socket通信、多线程、数据库操作和UI设计。开发者通过实现这个项目,不仅掌握了网络编程的基本原理,还锻炼了在Android平台上构建实际应用的能力。