Python服务器与多种客户端(Python/Java/Android)之间的通信

概述:

我们不会一直满足于客户端程序的开发,因为太过受限了。为了打破这样的受限,你需要做的就是去编写服务器端代码。以及如何在服务器与客户端之间的通信。以下将对此以Python为服务器,并分别以Python、Java、Android为客户端作一个简单的介绍。

服务器端:

test_tcp_server.py

#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print '...connected from:', addr

    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send('get your data:%s\n[%s]' % (data, ctime()))

        tcpCliSock.close

tcpSerSock.close

对于上面的代码,有一点需要我们来注意一下。tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)。当然如果你高兴,可以不加上这一句,不过不加这一句的后果就是上面的端口不能再复用。

客户端:

1.python

#!/usr/bin/env python

from socket import *

HOST = 'input your host ip'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data = raw_input('> ')
    if not data:
        break
    tcpCliSock.send(data)

    recv_data = tcpCliSock.recv(BUFSIZ)
    if not recv_data:
        break
    print recv_data

tcpCliSock.close()

2.Java

public static void main(String[] args) throws IOException {

        Socket socket = new Socket(HOST, PORT);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(("Hello server with java").getBytes());
        outputStream.flush();
        System.out.println(socket);

        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int n = is.read(bytes);
        System.out.println(new String(bytes, 0, n));

        is.close();
        socket.close();
    }

运行效果图:

3.Android

public class TCPClientActivity extends Activity {

    private int getLayoutResID() {
        return R.layout.activity_tcp_client;
    }

    private final int HANDLER_MSG_TELL_RECV = 0x124;

    private EditText mHostEditText = null;
    private EditText mPortEditText = null;
    private EditText mContentEditText = null;

    private Button mSubmitButton = null;
    private Button mCancelButton = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResID());

        initEvent();
    }

    private void initEvent() {
        initViews();

        setViews();
    }

    private void initViews() {
        mHostEditText = (EditText) findViewById(R.id.client_method_editText);
        mPortEditText = (EditText) findViewById(R.id.client_mode_editText);
        mContentEditText = (EditText) findViewById(R.id.client_content_editText);

        mSubmitButton = (Button) findViewById(R.id.client_submit_button);
        mCancelButton = (Button) findViewById(R.id.client_cancel_button);
    }

    private void setViews() {
        mSubmitButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String host = mHostEditText.getText().toString();
                String port = mPortEditText.getText().toString();
                String content = mContentEditText.getText().toString();

                Toast.makeText(TCPClientActivity.this, host + ", " + port + ", " + content, 0).show();
                startNetThread(host, Integer.parseInt(port), content);
            }
        });

        mCancelButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                setEmptyEdittext();
            }
        });
    }

    private void startNetThread(final String host, final int port, final String data) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket(host, port);
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write((data).getBytes());
                    outputStream.flush();
                    System.out.println(socket);

                    InputStream is = socket.getInputStream();
                    byte[] bytes = new byte[1024];
                    int n = is.read(bytes);
                    System.out.println(new String(bytes, 0, n));

                    Message msg = handler.obtainMessage(HANDLER_MSG_TELL_RECV, new String(bytes, 0, n));
                    msg.sendToTarget();

                    is.close();
                    socket.close();
                } catch (Exception e) {
                }
            }
        };

        thread.start();
    }

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            AlertDialog.Builder builder = new AlertDialog.Builder(TCPClientActivity.this);
            builder.setMessage("来自服务器的数据:" + (String)msg.obj);
            builder.create().show();
        };
    };

    private void setEmptyEdittext() {
        mHostEditText.setText("");
        mPortEditText.setText("");
        mContentEditText.setText("");
    }
}

运行效果图:

备注:对于上面的客户端程序,我想是没有什么问题的。不过如果你只是原原本本按照上面的流程来走,可能会运行不了。因为你Linux中的防火墙受限,在实验中我们通常选择关闭防火墙:

# /etc/init.d/iptables stop

时间: 2024-07-29 17:23:53

Python服务器与多种客户端(Python/Java/Android)之间的通信的相关文章

Python服务器开发一:python基础

Python服务器开发一:python基础 Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型. 2 Python具有很强的面向对象特性,而且简化了面向对象的实现.它消除了保护类型.抽象类.接口等面向对象的元素. 3 Python代码块使用空格或制表符缩进的方式分隔代码. 4 Python仅

Python服务器开发二:Python网络基础

Python服务器开发二:Python网络基础 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议. socket是对TCP/IP协议的封装和应用(程序员层面上).也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如

java多线程之间的通信

如何让两个线程依次执行?那如何让 两个线程按照指定方式有序交叉运行呢?四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的三个运动员各自准备,等到三个人都准备好后,再一起跑子线程完成某件任务后,把得到的结果回传给主线程1.如何让两个线程依次执行?#Copypublic static void main(String[] args) {demo1();/结果: t1>>pirnt:1t2>>pirnt:1t2>>pir

黑马程序员————java线程之间的通信

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 多线程可以让我们同时共享一个资源,但如果在共享这个资源时需要彼此之间的联系怎么做呢? 经典实例:生产者与消费者. 问题描述,生产者每生产一个消费者就要取走一个,同时进行. 首先java为我们提供了一套等待唤醒机制,让线程与线程之间产生了联

java线程之间的通信

1.常用的方法 sleep()该线程进入等待状态,不释放锁 wait() 该线程进入等待状态,释放锁 notify() 随机唤醒一个线程 notifyAll() 唤醒全部线程 2.线程之间的通信 a.两个线程之间的通信 public class ThreadExchange { @Test public void test2Thread() { MyPrint myPrint = new MyPrint(); new Thread(new Runnable() { @Override publi

Python应用01 原始Python服务器

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人留言,表示只学Python没有用,必须学会一个框架(比如Django和web.py)才能找到工作.而我的想法是,掌握一个类似于框架的高级工具是有用的,但是基础的东西可以让你永远不被淘汰.不要被工具限制了自己的发展.今天,我在这里想要展示的,就是不使用框架,甚至不使用Python标准库中的高级包,只使用标准库中的socket接口(我不是很明白套接字这个

两个java项目之间的通讯

两个Java项目,他们之间进行信息的通信 前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径. 其实两个java项目之间的通信还是使用HTTP的请求.主要有两种方式: ①使用apache的HttpClient方式. ②使用JDK自带的java.NET包下的HttpURLConnection方式. HttpURLConnection方式: HttpURLConnection传递请求常用的有两种方式:POST和GET方式.使用setRequestMethod()方法设置传递

两个java工程之间的相互调用方法

如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种方式:①使用apache的HttpClient方式.②使用JDK自带的java.net包下的HttpURLConnection方式. 这次主要讲解HttpURLConnection方式:HttpURLConnection传递请求常用的有两种方式:POST和GET方式.使用setRequestMeth

计算机相关视频资料分享(C/C++、python、java/Android、linux、算法、数据库等)

相关视频学习资料(C/C++.python.java/Android.linux.算法.数据库等)仅用于学习交流,不要用于商业目的. 1.C/C++ 系列 链接:http://pan.baidu.com/s/1gdvKXIN 密码:lglp 2.python系列 链接:http://pan.baidu.com/s/1eQzl4aQ 密码:5931 3.linux 系列: 链接:http://pan.baidu.com/s/1hq7UiDu 密码:yk7r 4.java 和Android 系列 链