此demo包括两个moudle,一个Server,另一个Client,Server是个纯java文件,可以放到随便什么地方去执行,只要有JDK;Client是Android App。运行时注意修改IP为自己的IP,需要在同一个局域网下。
demo:下载地址
Server
package com.example;
//注意,服务器是纯JAVA程序,创建Module时More Modules选最后的Java Library
//注意:作为服务器的pc是有IP地址的,但是作为客户端的android虚拟机的IP无从得知,
//所以,放弃pc服务器主动连接虚拟机客户端吧骚年(通过有些IP映射方法可以)
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class Server {
public static void main(String args[]) {
new Server();
}
public Server() {
while(true){
System.out.println("请选择服务器类型:1,TCP 2,UDP");
Scanner in = new Scanner(System.in);
int k = in.nextInt();
if (k == 1) {
BoBoTCP();
} else if (k == 2) {
BoBoUDP();
}
}
}
public void BoBoTCP() {
try {
ServerSocket ss = new ServerSocket(7877);//创建绑定到500端口的服务器套接字,端口尽量使用1024以上,前面的被占用的概率大
System.out.println("服务器正在监听");
Socket s = ss.accept();//侦听并接受到此服务器套接字的连接,并把这个链接赋给套接字 s
//以后的联系就交给s了,在ss监听到链接信号前这条语句会一直阻塞程序,直到有链接才会执行后面的程序
InputStreamReader isr = new InputStreamReader(s.getInputStream());//(此套接字的输入流)
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
//(此套接字的输出流,true:println、printf 或 format 方法将刷新输出缓冲区)
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
//读入的数据要注意有\r或\n或\r\n,因为br.readLine()碰到他们才会返回读到的数据
//没有数据或换行回车时会阻塞,在数据流异常或断开时才会返回null
System.out.println(message);
pw.println("Hello,client!!");
} catch (Exception e) {
System.out.println(e);
}
}
public void BoBoUDP() {
try {
//创建DatagramSocket对象,指定接收端口
DatagramSocket socket = new DatagramSocket(7877);
System.out.println("服务器正在监听");
byte data[] = new byte[1024];
//创建孔德DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data, data.length);
//用receive方法接收客户端发来的数据
socket.receive(packet);
String myResult=new String(packet.getData(),packet.getOffset(),packet.getLength());
System.out.println(myResult);
} catch (Exception e) {
System.out.println(e);
}
}
}
Client源码:
package fk.androiddemo_013;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button butTCP,butUDP;
String myURL="10.0.120.93";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
butTCP = (Button) findViewById(R.id.serverButTCP);
butTCP.setOnClickListener(this);
butUDP = (Button) findViewById(R.id.serverButUDP);
butUDP.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v==butTCP) {
new ServerThreadTCP().start();
System.out.println("client sends msg ...");
}else{
new ServerThreadUDP().start();
System.out.println("client sends msg ...");
}
}
class ServerThreadTCP extends Thread {
public void run() {
OutputStream outputStream = null;
InputStream inputStream = null;
Socket socket = null;
try {
socket = new Socket(myURL, 7877);
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
String str = "hello server !!\n";
byte data[] = str.getBytes();
outputStream.write(data, 0, data.length);
outputStream.flush();
byte buffer[] = new byte[1024 * 4];
int temp = 0;
while ((temp = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, temp));
}
System.out.println("-----------------------");
} catch (Exception e) {
System.out.println(e);
} finally {
try {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class ServerThreadUDP extends Thread {
DatagramSocket socket=null;
public void run() {
try {
//创建DatagramSocket对象,指定目的端口
DatagramSocket socket = new DatagramSocket(7877);
//创建InetAddress对象,指定发目的地址
InetAddress serverAddress = InetAddress.getByName(myURL);
String str = "hello server !!\n";
byte data[] = str.getBytes();
//创建DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 7877);
//把包裹广播出去
socket.send(packet);
System.out.println("msg send....");
} catch (Exception e) {
System.out.println(e);
}
finally {
}
}
}
}
运行截图:
输出截图:
PS:
1,纯Android的moudle输出中文会乱码,需要在 build.gradle 中添加如下代码(只针对新版AS):
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
2,AS中可以在同一个项目下建立一个纯java moudle,方法是建立moudle时选择java library,两个moudle可以分别独立运行。