Android 客户端Socket 与 Java服务端ServerSocket 简单小例子

新建一个Java项目

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    private final int SERVERPORT = 9898;//定义端口
    private ServerSocket serverSocket;    //声明服务器套接字
    private OutputStream outputStream;    //声明输出流
    private InputStream inputStream;    //声明输入流
    private PrintWriter printWriter;    //声明打印流
    private Socket socket;                //声明套接字
    private BufferedReader reader;        //声明缓冲流,用于读取接收的数据

    public Server(){
        try {
            //根据指定端口号,创建套接字
            serverSocket = new ServerSocket(SERVERPORT);
            System.out.println("服务启动...");
            socket = serverSocket.accept();//用accept()方法等待客户端的连接
            System.out.println("客户端已连接...");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            outputStream = socket.getOutputStream();//获取套接字输出流
            inputStream = socket.getInputStream();    //获取套接字输入流

            //根据输出流创建PrintWriter对象(用于写入数据)
            printWriter = new PrintWriter(outputStream,true);

            //根据输入流创建BufferedReader对象(用于读取数据)
            reader = new BufferedReader(new InputStreamReader(inputStream));

            /*
             * 根据System.in创建BufferedReader对象
             * BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
             * 拆开为:
             *     InputStream is = System.in;                         //(System.in)接受从控制台输入的字节
             *     InputStreamReader isr = new InputStreamReader(in);    //将字节流转换为字符流
             *     BufferedReader br = new BufferedReader(isr);        //将字符流存入缓冲流
             */
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

            while(true){
                String message = reader.readLine();                    //读取客户端传输的信息
                System.out.println("来自客户端的信息:" + message);    //将接收的信息输出

                if(message.equals("Bye")||message.equals("bye"))     //如果信息为“Bye”或“bye”,则结束通信
                    break;
                message = in.readLine();                            //接受键盘输入
                printWriter.println(message);                        //将接受的信息向客户端输出
            }
            outputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
            System.out.println("客户端关闭连接...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server();
    }
}

新建一个Android项目:

其中Activity:

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;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity;

public class ClientActivity extends Activity implements Runnable,OnClickListener{

    private TextView chatmessage;    //用于显示聊天记录
    private EditText sendmessage;    //用于用户输入短信内容
    private Button send_btn;        //用于发送短信

    private static final String HOST = "10.0.2.2";//服务器IP地址
    private static final int PORT = 9898;         //服务器端口号

    private Socket socket;
    private BufferedReader reader;
    private PrintWriter writer;
    private String str = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);

        chatmessage = (TextView) this.findViewById(R.id.chatmessage);
        sendmessage = (EditText) this.findViewById(R.id.sendmessage);
        send_btn = (Button) this.findViewById(R.id.send_btn);
        send_btn.setOnClickListener(this);

        new Thread(this).start();//启动线程
    }

    @Override
    public void run() {
        /*
         * state>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
         *
         * 这一坨代码本来是直接写在onCreate()中,但运行时报了android.os.NetworkOnMainThreadException错误,
         *  后来根据园友的:https://www.cnblogs.com/lixiaolun/p/3472757.html 解决
         */
        try {
            //指定ip和端口号,创建套接字
            socket = new Socket(HOST,PORT); 

            //使用套接字的输入流构造BufferedReader
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //使用套接字的输出流构造PrintWriter
            OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
            BufferedWriter bw = new BufferedWriter(osw);
            writer = new PrintWriter(bw,true);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //end>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        try {
            while(true){
                //若套接字连接服务器,且输入流没有关闭
                if(socket.isConnected()){
                    if(!socket.isInputShutdown()){
                        if((str = reader.readLine())!= null){
                            str += " ";
                            handler.sendMessage(handler.obtainMessage());
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View arg0) {
        if(arg0.getId() == R.id.send_btn){
            //获取输入框内容
            String message = sendmessage.getText().toString().trim();
            //判断socket是否连接
            if(socket.isConnected()){
                //如果输出关闭,则不执行
                if(socket.isOutputShutdown())
                    return;
                writer.println(message);//将输出内容发送到服务器
                //设置chatmessage内容
                chatmessage.setText(chatmessage.getText()+"\n"+"发送:"+message);
                //清空sendmessage的内容,以便下次输入
                sendmessage.setText("");
            }
        }
    }

    public Handler handler = new Handler(){
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            chatmessage.setText(chatmessage.getText().toString()+"\n"+"来自服务器端的消息:" + str);
        }
    };
}

对应的 xml 布局文件(activity_client.xml):

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".ClientActivity" >
    <TextView
        android:id="@+id/chatmessage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:hint="聊天记录。。。" />

    <EditText
        android:id="@+id/sendmessage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:hint="请输入..." />

    <Button
        android:id="@+id/send_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送" />
</LinearLayout>

还有AndroidManifest.xml 中记得申请权限:

<uses-permission android:name="android.permission.INTERNET"/><!-- 访问网络权限 -->

最后,先启动Java项目,然后在启动Android项目

注:如果运行报错,多半是IP地址对不上的问题,这需要自行百度

注:代码写的并不规范!!!

原文地址:https://www.cnblogs.com/a284390/p/11137436.html

时间: 2024-09-28 19:59:50

Android 客户端Socket 与 Java服务端ServerSocket 简单小例子的相关文章

[Java]命令行模拟TCP客户端与服务端的简单小程序遇到的问题(基础不牢!扎实和亲手实践比什么都重要!)

简单得不能再简单的需求: 简单模拟TCP客户端与服务端的一次连接和通信,客户端发出一个消息,服务端回馈一个消息 自己第一次编写的代码: Client: class TcpClient1 { public static void main(String[] args) throws Exception { Socket s=new Socket("127.0.0.1",10010); OutputStream out=s.getOutputStream(); out.write(&quo

初识websocket及java服务端的简单实现

概念:WebSocket是一种在单个TCP连接上进行全双工通信的协议. WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 背景:很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很明显的缺点,即浏览器需

android客户端利用sokcet通信和向Java服务端发请求,Java服务端把文件发给android客户端

Java服务端 package com.yqq.socketTest; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

android客户端和java服务端用aes加密

最近在公司做一个项目,老大让我们实现加解密的方法,我把工作直接推给了java服务端,他们也是直接在网上copy的代码,说我直接放到我的android代码中就可以了,不需要太多的更改.我就照做了,但是在真正的测试的时候,发现两边输入的密码一致,但是加密结果不一致.这可折磨我们了好久,最终解决了这个问题,加以记录. android和java加密结果不一样的原因,是因为他们的默认随机数序列不一致,所以解决他的办法是,不要使用默认的创建方法. 以下是正确的代码.android和java端的代码是一致的.

RPC学习--C#使用Thrift简介,C#客户端和Java服务端相互交互

本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 其中使用到RPC学习----Thrift快速入门和Java简单示例,这篇文章创建的Java服务端. 一.C#中使用Thrift简介 关于rpc的简介,可以参考:RPC学习----Thrift快速入门和Java简单示例 1.下载thrift 1)点击下载:thrift-0.9.1.tar.gz(或者http://thrift.apache.org/download) 2)

【转】C# client 与java netty 服务端的简单通信,客户端采用Unity

http://blog.csdn.net/wilsonke/article/details/24721057 近日根据官方提供的通信例子自己写了一个关于Unity(C#)和后台通信的类,拿出来和大家分享一下. 具体请参考: 1.java服务端用的apach.mina框架搭建.java服务端请参考:http://blog.9tech.cn/?c=site&m=article&id=548 2.C#环境:.NET framework 2.0 3.C#帮组文档,及Socket注解:http://

android客户端 与javaweb服务端的简单理解

客户端定义的变量 永远都是一个人在用,所以定义成类的成员变量不会产生脏数据,对成员变量的访问都是一个线程 一个人在操作.可以尽可能的使用成员变量. Java服务端的程序  是并发的,有可能并发数会很大超过100多,后台的程序都是多人多线程访问,所以减少业务层成员变量的定义,尽量定义方法内的局部变量.在多线程运行方法 ,都是每个线程 分配给方法一个栈区域内存,每个方法内的 对象都是唯一,都是 new的.

客户端技术:Cookie 服务端技术:HttpSession

客户端技术:Cookie 服务端技术:HttpSession 07. 五 / android基础 / 没有评论 一.会话技术1.什么是会话:客户打开浏览器访问一个网站,访问完毕之后,关闭浏览器.这个过程称之为一个会话.就如同打电话.2.会话在编程中主要解决的问题是:保存各个用户的数据信息.3.保存用户各自数据的主要技术:客户端技术:Cookie服务端技术:HttpSession 二.Cookie1.获取Cookie采用request.getCookies()2.设置Cookie采用respons

Flex通信-Java服务端通信实例

Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求的形式访问服务器 RmoteObject:通过AMF协议,以二进制的形式交互数据 Socket:套接字协议,服务器和客户端以IO的形式交互数据 上面几种各有个的优势:WebService常用于跨语言调用,不过解析协议需要花不少时间,运行速度不快:HttpService类似于Ajax:通常RmoteO