Android下的socket网络编写+Python服务器
这是第一次接触到android相关知识,也是第一篇原创文章,就写一个简单的,为什么要来写这个呢?起初都是用一些小字条记录一些感受一些重要的的语句,我平时的编程呢,遇到错误都是来网上找相关的资料,学习新的东西也是去网上看各位大佬的观点,受益匪浅吧。
话不多说,打个样
下面就是介绍一下这个文章要实现的功能吧。
1、编写一个编写一个活动页面,要求可以连接到一个tcp服务端,并通过UI编写要向对方发送的文本, 用户可用按钮控制内容的发送,服务端能成功显示明文。(要是要加密的话,就可以在此基础上自行添加加密方法)
简单介绍一下socket
Socket是一种网络通讯接口,通信两端通过它来发送和接收数据。
Socket的主要特点:使用简单且可移植。
Socket有两种传输模式:面向连接和无连接:
1、面向连接模式使用TCP协议,在通信两端建立通信链路,用数据流的方式发送和接收数据。
2、无连接模式使用UDP协议,用数据报文形式发送数据。
端口: 两种传输模式都会用到端口,是用来区分不同的连接的一个标识。
TCP(Transmission Control Protocol,传输控制协议)
是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
这里就不多说tcp的信息了。
基于TCP的Socket通信步骤
1、TCP服务器端的步骤:
(1)、创建服务器socket:
ServerSocket(int port)
ServerSocket(int port,in backlog)
ServerSocket(int port,int backlog,InetAddress localAddr)
ServerSocket serversock= new ServerSocket(12345);//12345为端口号
//serversock调用accept()方法接收客户端请求,如果获取了请求,返回和该客户端通信的socket;
clientsock=serversock.accept();
//获取和客户端传输的输出流和输入流:
OutputStream ostream = sock.getoutputStream();
InputStream istream = sock.getInputStream();
//进行数据传输:
ostream.write…
Istream.read
(2)、TCP客户端的步骤:
//连接服务器:
Socket sock = new Socket(“192.168.1.3”,10001);
//获取和服务器传输的输出流和输入流:
InputStream istream = sock.getInputStream();
OutputStream ostream = sock.getoutputStream();
//进行数据传输:
ostream.write…
Istream.read
下面是实操代码
先去编写界面:
//这是activity_main.xml界面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<EditText
android:id="@+id/ed1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="24dp"
android:layout_marginTop="39dp"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/linkbt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/ed1"
android:layout_below="@+id/ed1"
android:layout_marginTop="24dp"
android:text="连接" />
<Button
android:id="@+id/linkbt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/linkbt1"
android:layout_alignBottom="@+id/linkbt1"
android:layout_alignRight="@+id/ed1"
android:text="发送" />
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/linkbt1"
android:layout_marginTop="86dp"
android:layout_toRightOf="@+id/linkbt1"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
界面图片:
这里书写MainActivity.java:
因为这个网络通信之间需要实时更新,就需要用到线程去更新UI界面
public class MainActivity extends Activity {
Button linkbt1,sendbt1;
EditText ed1;
TextView tv1;
Socket sock;
OutputStream ostream;
Handler thandler;
Thread td;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取到界面组件
ed1=(EditText)findViewById(R.id.ed1);
tv1=(TextView)findViewById(R.id.tv1);
linkbt1=(Button)findViewById(R.id.linkbt1);
sendbt1=(Button)findViewById(R.id.linkbt2);
//连接按钮监听,当连接时,给子线程一个消息:1
linkbt1.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Todo Auto-generated method stub
thandler.sendEmptyMessage(1);
}
});
//发送消息按钮
sendbt1.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Todo Auto-generated method stub
Message msg=new Message();
//将标志信息设为2,让线程执行不同的功能
msg.what=2;
//获取到用户输入的信息
msg.obj=ed1.getText().toString();
thandler.sendMessage(msg);
}
});
Runnable r=new Runnable() {
@Override
public void run() {
//消息队列的准备
Looper.prepare();
thandler=new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 1){
try{
//这里修改为自己的ip地址,设置端口号为12345
sock=new Socket("10.0.0.0",12345);
ostream=sock.getoutputStream();
//2个线程进行嵌套
runOnUiThread(new Runnable() {
@Override
public void run() {
//给用户一个连接成功的提示
Toast.makeText(getApplicationContext(), "连接成功", Toast.LENGTH_SHORT).show();
}
});
}catch(Exception e){
Log.i("info",e.toString());
}
}else if(msg.what == 2){
try{
//获取的消息以字节流的方式发给服务端
ostream.write(( (String) msg.obj).getBytes());
ostream.flush();
}catch(Exception e){
Log.i("info",e.getMessage());
}
}
}
};
//loop,消息不停循环取
Looper.loop();
}
};
td=new Thread(r);
td.start();//线程开启
}
}
最后一步且必不可少的,往AndroidManifest.xml中添加网络服务:
<uses-permission android:name="android.permission.INTERNET" />
现在需要自己搭建一个Python环境,官网安装一个就好,出现下面的界面就ok了
#coding=utf-8
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345 # 设置端口
s.bind((host, port)) # 绑定端口
chunks = []
s.listen(5) # 等待客户端连接
while True:
con,addr=s.accept()
print ('a client connected!',addr)
while True:
chunks = con.recv(1024)
if len(chunks) == 0:
break
print (repr(chunks))
con.close()
到此为止,整项目就简单完成了,现在来跑一下,看一下效果