2、1、TCP服务器端
主要步骤:
(1)调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上
(2)调用accpet(),监听连接请求,如果客户端请求连接,则接收连接,返回通信套接字
(3)调用Socket类的getOutputStream()和getInputStream()获取输出流和输入流
(4)关闭通信套接字
2、2、TCP客户端
主要步骤:
(1)调用Socket()创建一个流套接字,并连接到服务器端
(2)调用Socket类的getOutputStream()和getInputStream()方法获取输出和输入流,开始网络数据的发送和接收
(3)关闭通信套接字
3、1、服务器端
服务器端主要使用Java main()方法+线程Thread实现
(1)TCP_Server.java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Server {
public static void main(String[] args) {
//TCP通信的端口号
int TCP_SERVER_PORT=12345;
//初始化服务器线程
ServerThread serverThread = new ServerThread(TCP_SERVER_PORT);
serverThread.start();
}
}
(2)TCPThread.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerThread extends Thread {
//创建一个ServerSocket对象
private ServerSocket serverSocket=null;
private int mTCP_SERVER_PORT;
public ServerThread(int TCP_SERVER_PORT){
this.mTCP_SERVER_PORT=TCP_SERVER_PORT;
}
@Override
public void run(){
super.run();
while (true)
{
try{
System.out.println("Server服务器正在监听");
//mTCP_SERVER_PORT为指定的绑定的端口,为int类型
serverSocket=new ServerSocket(mTCP_SERVER_PORT);
//监听连接请求
Socket socket=serverSocket.accept();
System.out.println("客户端已连接");
//写入读Buffer中
BufferedReader in=new BufferedReader(new
InputStreamReader(socket.getInputStream())); //获取输入流
//放到写的Buffer中
BufferedWriter out=new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream()));//获取输出流
//读取接收信息,转换为字符串
String incomingMsg=in.readLine()+System.getProperty("line.separator");
//显示接收信息
System.out.println(incomingMsg);
//生成发送字符串
String outgoingMsg="googbye from
port:"+mTCP_SERVER_PORT+System.getProperty("line.separator");
//将发送字符串写入上面定义的BufferedWriter中
out.write(outgoingMsg);
//刷新,发送
out.flush();
//关闭socket
socket.close();
}catch (InterruptedIOException e){
//超时错误
e.printStackTrace();
}catch (IOException e){
//IO异常
e.printStackTrace();
}finally {
//判定是否初始化ServerSocket对象,如果初始化则关闭serverSocket
if(serverSocket!=null){
try {
serverSocket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
}
3、1、客户端
客户端为Android部分,有MainActivity.java、ClientThread.java、activity_main.xml三部分组成
(1)MainActivity.java 主要是显示一个用户界面,并且开启线程,该线程与ClientThread.java相关
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
String localhost="192.168.43.81"; //这里为PC机的IP地址
final int PORT=12345;
Button send_btn;
private void init_view()
{
send_btn=findViewById(R.id.btn_send);
}
public void btn_send_onClick(View view){
ClientThread clientthread=new ClientThread(localhost,PORT);
clientthread.start();
Log.i("按钮点击事件响应:","客户端线程启动");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init_view();
}
}
(2)ClientThread.java 用于与服务器端相连接的相关操作
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientThread extends Thread {
private String LocalHost;
private int TCP_SERVER_PORT;
public ClientThread(String localhost,int port)
{
this.LocalHost=localhost;
this.TCP_SERVER_PORT=port;
}
@Override
public void run(){
super.run();
try {
//初始化Socket,TCP_SERVER_PORT为指定的端口,int类型
Socket socket=new Socket(LocalHost,TCP_SERVER_PORT);
//获取输入流
BufferedReader in=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
//生成输出流
BufferedWriter out=new BufferedWriter((new
OutputStreamWriter(socket.getOutputStream())));
//生成输出内容
String outMsg="TCP connecting to
"+TCP_SERVER_PORT+System.getProperty("line.separator");
//写入
out.write(outMsg);
//刷新,发送
out.flush();
//获取输入流
String inMsg=in.readLine()+System.getProperty("line.separator");
Log.i("TCPClient","received:"+inMsg);
//关闭连接
socket.close();
}catch (UnknownHostException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
(3)activity_main.xml 布局文件
(4)需要在AndroidManifest.xml配置文件中添加权限
服务器端运行结果
客户端运行结果