目录
一、服务器端
在PC上运行,仅仅建立ServerSocket监听,并使用Socket获取输出流输出。该ServerSocket将会一直监听,等待客户端程序的连接。
//基于TCP的Socket网络通信例程 服务器端
public class SimpleServer {
public static void main(String[] args) throws IOException{
{
//创建一个ServerSocket,用于监听客户端Socketde连接请求
ServerSocket ss = new ServerSocket(30050);
//采用循环不断的接收来自客户端的请求
while(true){
//每当接收到客户端Socket的请求,服务器端也对应产生一个Socket
Socket s = ss.accept();
OutputStream os = (OutputStream) s.getOutputStream();
os.write("您好,您收到了服务器的消息!\n".getBytes("utf-8"));
//关闭输出流,关闭Socket
os.close();
s.close();
}
}
}
}
接下来的代码用于打开Socket对应的输出流,并向输出流中写入一段字符串数据。这里强行 指定使用UTF-8字符集进行编码,可以避免乱码。
二、客户端
仅仅使用Socket建立与指定IP地址、指定端口的连接,并使用Socket获取输入流。
/**
* 基于TCP的Socket网络通信例程 Android端
*@author dahaiChang
*created at 2019/8/16 10:45
*/
public class MainActivity extends Activity {
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = findViewById(R.id.show);
new Thread(){
@Override
public void run() {
super.run();
try {
//建立连接到远程服务器的Socket
Socket socket = new Socket("192.168.1.128", 30050);
//加入10s超时及处理
socket.setSoTimeout(1000);
//将Sockt对应的输入流包装成BufferReader
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//进行普通IO操作
String line = br.readLine();
show.setText("来自服务器的数据:" + line);
} catch (SocketException e) {
e.printStackTrace();
Log.e(TAG,"请求超时");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
由于建立网络连接和 通信是不稳定的,所需时间也不确定,因此需要在子线程中完成网络连接。因此在配置文件中添加网络权限。
<uses-permission android:name="android.permission.INTERNET"/>
三、遇到连接不上的问题解决办法
1、客户端与服务器端要处于同一个局域网中
2、PC端的防火墙要关闭
四、加入等待超时处理
在实际应用中,程序可能不想让执行网络连接、读取服务器数据的进程一直阻塞,要加入等待 超时处理。
//加入10s超时及处理
socket.setSoTimeout(1000);