Socket客户端源码
Android TCP/Socket通信代码:

网络权限:
<uses-permission android:name="android.permission.INTERNET" />
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:hint="Ip"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:id="@+id/EdtTcpSerIp"/>
<EditText
android:hint="Port"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:id="@+id/EdtTcpPort"/>
<Button
android:onClick="onConnectClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connect"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接收到的数据"/>
<TextView
android:scrollbars="vertical"
android:background="#fff"
android:text=""
android:layout_width="300dp"
android:layout_height="250dp"
android:id="@+id/TVTcpData"/>
<EditText
android:hint="SendData"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:id="@+id/EdtTcpMsg"/>
<Button
android:text="Send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onSendMsgClick"/>
</LinearLayout>
TcpHelpre类:
package com.socketnewtwo.fred.mysocketnew;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
public class TcpHelper{
private Socket socket;
private BufferedWriter bufferedWriter;
private DataInputStream inputStream;
private boolean NeedStop;
private InetSocketAddress SerAddr;
public String ErrMsg;
private ReadThread readThread; //读取数据线程
private OnReceiveEvent receiveEvent; //此事件用于当接收到数据时向主线程通知接收到的数据
private long LastCheckTime;
public static interface OnReceiveEvent{
public void ReceiveBytes(byte[] iData);
public void ReceiveString(String iData);
}
public enum EDataType{EDT_BYTE,EDT_STRING};
private EDataType dataType;
public TcpHelper(String HostIp,int HostPort) {
try {
LastCheckTime=System.currentTimeMillis();
readThread =new ReadThread();
NeedStop=false;
SerAddr = new InetSocketAddress(HostIp,HostPort);
NeedStop=false;
socket = new Socket();
readThread.start();
}catch (Exception e)
{
ErrMsg=e.getMessage();
}
}
public void SendString(String iText){ //发送字符串
dataType=EDataType.EDT_STRING;
toSend(iText);
}
public void SendBytes(byte[] iBuf){ //发送字节流指令
dataType=EDataType.EDT_BYTE;
String iText = new String(iBuf);
toSend(iText);
}
//发送数据线程
private void toSend(final String iText){
new Thread(
new Runnable() {
@Override
public void run() {
try {
bufferedWriter.write(iText);
bufferedWriter.flush();
} catch (Exception e) {
}
}
}
).start();
}
public boolean isConnected(){
return socket.isConnected();
}
//设置通知事件
public void setReceiveEvent(OnReceiveEvent iEvent){
receiveEvent=iEvent;
}
//读取线程
private class ReadThread extends Thread{
@Override
public void run() {
while (!NeedStop){
try {
if (!socket.isConnected() || socket.isClosed()){
socket.connect(SerAddr,3000);
if(bufferedWriter==null)
bufferedWriter =new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),"utf-8"));
if(inputStream==null)
inputStream = new DataInputStream(socket.getInputStream());
}
else {
if(inputStream.available()>0){
byte[] recData = new byte[inputStream.available()];
inputStream.read(recData);
if(receiveEvent!=null)
{
if(dataType==EDataType.EDT_BYTE) {
receiveEvent.ReceiveBytes(recData);
}
else {
String s=new String(recData,"utf-8");
receiveEvent.ReceiveString(s);
}
}
}
if (System.currentTimeMillis()-LastCheckTime>5000)
{
try {
LastCheckTime=System.currentTimeMillis();
socket.sendUrgentData(0xFF);
}catch (Exception e){
socket.close();
socket = new Socket();
bufferedWriter=null;
inputStream =null;
}
}
}
}catch (Exception e){
}
}
}
}
}
MainActivity主程序:
package com.socketnewtwo.fred.mysocketnew;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TcpHelper tcpHelper;
private String SerIp;
private int SerPort;
private EditText InputMsg;
private TextView RecMsg;
private String TcpRecData;
private MyHandler handler;
private TcpReceive tcpReceive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecMsg = findViewById(R.id.TVTcpData);
InputMsg = findViewById(R.id.EdtTcpMsg);
RecMsg.setMovementMethod(ScrollingMovementMethod.getInstance());
}
public class TcpReceive implements TcpHelper.OnReceiveEvent {
public synchronized void ReceiveBytes(byte[] iData) {
}
public synchronized void ReceiveString(String iData) {
TcpRecData = iData;
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}
class MyHandler extends Handler {
public MyHandler() {
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
RecMsg.append(TcpRecData+"\n"); //接收到数据显示到TextView上
break;
}
super.handleMessage(msg);
}
}
public void onConnectClick(View view) {
if (tcpHelper == null) {
SerIp = ((EditText) findViewById(R.id.EdtTcpSerIp)).getText().toString();
SerPort = Integer.parseInt(((TextView) findViewById(R.id.EdtTcpPort)).getText().toString());
tcpHelper = new TcpHelper(SerIp, SerPort);
tcpReceive = new TcpReceive();
tcpHelper.setReceiveEvent(tcpReceive);
handler = new MyHandler();
}
}
public void onSendMsgClick(View view) {
try {
String iText = InputMsg.getText().toString();
tcpHelper.SendString(iText);
} catch (Exception e) {
}
}
}
注:Android客户端要和PC端的编码格式一样
String s=new String(recData,"utf-8");

浙公网安备 33010602011771号