问一下,安卓手机客户端和PC服务器通信,一般使用什么语言搭建PC服务器,哪种比较简单?
一般来说,通信协议都会设计成语言无关的,所以,服务器端使用什么语言和客户端是什么平台没关系。
所以,服务器使用什么语言,只和你的研发团队习惯使用什么语言和什么语言可以满足业务需求有关。。
使用基于TCP协议的Socket
一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如19216811),也可以是主机名(examplecom)。
而在android 40 之后系统以后就禁止在主线程中进行网络访问了,原因是:
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
以下是一个android socket客户端的例子:
---------------------------------Java代码---------------------------------------
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintStream;
import javaioUnsupportedEncodingException;
import javanetInetSocketAddress;
import javanetSocket;
import javanetUnknownHostException;
import androidappActivity;
import androidcontentContext;
import androidosBundle;
import androidosHandler;
import androidosMessage;
import androidviewView;
import androidwidgetButton;
import androidwidgetEditText;
import androidwidgetToast;
public class TCPSocketActivity extends Activity {
public static final String TAG = TCPSocketActivityclassgetSimpleName();
/ 服务器地址 /
private String host_ip = null;
/ 服务器端口 /
private int host_port = 0;
private Button btnConnect;
private Button btnSend;
private EditText editSend;
private EditText hostIP;
private EditText hostPort;
private Socket socket;
private PrintStream output;
private String buffer = "";
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_socket_test);
context = this;
initView();
btnConnectsetOnClickListener(new ButtonOnClickListener() {
@Override
public void onClick(View v) {
host_ip = hostIPgetText()toString();
host_port = IntegerparseInt(hostPortgetText()toString());
new Thread(new ConnectThread())start();
}
});
btnSendsetOnClickListener(new ButtonOnClickListener() {
@Override
public void onClick(View v) {
new Thread(new SendThread(editSendgetText()toString()))start();
}
});
}
private void toastText(String message) {
ToastmakeText(context, message, ToastLENGTH_LONG)show();
}
public void handleException(Exception e, String prefix) {
eprintStackTrace();
toastText(prefix + etoString());
}
public void initView() {
btnConnect = (Button) findViewById(RidbtnConnect);
btnSend = (Button) findViewById(RidbtnSend);
editSend = (EditText) findViewById(RidsendMsg);
hostIP = (EditText) findViewById(RidhostIP);
hostPort = (EditText) findViewById(RidhostPort);
}
private void closeSocket() {
try {
outputclose();
socketclose();
} catch (IOException e) {
handleException(e, "close exception: ");
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
superhandleMessage(msg);
if (0x123 == msgwhat) {
toastText("连接成功!");
}
}
};
/ 连接socket线程 /
public class ConnectThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = Messageobtain();
try {
if (null == socket || socketisClosed()) {
socket = new Socket();
socketconnect(new InetSocketAddress(host_ip,host_port),5000);
output = new PrintStream(socketgetOutputStream(), true,
"utf-8");
}
msgwhat = 0x123;
handlersendMessage(msg);
} catch (UnsupportedEncodingException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
}
/发送信息线程/
public class SendThread implements Runnable {
String msg;
public SendThread(String msg) {
super();
thismsg = msg;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
outputprint(msg);
} catch (Exception e) {
eprintStackTrace();
}
closeSocket();
}
}
public class SocketThread implements Runnable {
public String txt1;
public SocketThread(String txt1) {
super();
thistxt1 = txt1;
}
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = Messageobtain();
try {
/ 连接服务器 并设置连接超时为5秒 /
if (socketisClosed() || null == socket) {
socket = new Socket();
socketconnect(new InetSocketAddress(host_ip,host_port),5000);
}
// 获取输入输出流
PrintStream ou = new PrintStream(socketgetOutputStream(),
true, "UTF-8");
BufferedReader bff = new BufferedReader(new InputStreamReader(
socketgetInputStream()));
// 读取发来服务器信息
String line = null;
buffer = "";
while ((line = bffreadLine()) != null) {
buffer = line + buffer;
}
// 向服务器发送信息
ouprint(txt1);
ouflush();
// 关闭各种输入输出流
bffclose();
ouclose();
socketclose();
msgwhat = 0x123;
handlersendMessage(msg);
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
}
}
-----------------------------布局文件activity_socket_testxml--------------------------------------
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android="http://schemasandroidcom/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white"
android:orientation="vertical" >
<EditText
android:id="@+id/hostIP"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:hint="服务器ip"
android:singleLine="true"
android:inputType="text" />
<EditText
android:id="@+id/hostPort"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:hint="端口"
android:singleLine="true"
android:inputType="number" />
<Button
android:id="@+id/btnConnect"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal"
android:background="@drawable/style_btn_shape"
android:layout_margin="5dip"
android:text="@string/connect"
android:textColor="@color/white" />
<EditText
android:id="@+id/sendMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:hint="需要发送的内容"
android:inputType="text" />
<Button
android:id="@+id/btnSend"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:background="@drawable/style_btn_shape"
android:layout_gravity="center_vertical|center_horizontal"
android:text="@string/send"
android:textColor="@color/white" />
</LinearLayout>
-------------------------样式文件style_btn_shapexml----------------------------------
<xml version="10" encoding="UTF-8">
<shape
xmlns:android="http://schemasandroidcom/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="#0465b2" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="15dip" />
<!-- padding:Button里面的文字与Button边界的间隔 -->
<padding
android:left="10dp"
android:top="10dp"
android:right="10dp"
android:bottom="10dp"
/>
</shape>
------------------------------END---------------------------------------
1、android上的服务器分两种:
① 用 java 写的,这种比较简单,但是需要注意的它的代码已经被转换成了大端了,pc上用c++写传结构体;
② 用 c/c++ 写的,这种方式进行和pc上的通信比较的方便,客户端和服务器段可以都通过结构来传递,唯一需要考虑的是字节对其的问题,可以用两个预处理指令(可以跨平台的)处理;
2、源码的话,我虽然有但是属于公司的项目代码,不方便的;
我是ndk吧的吧主,希望大家关注一下ndk吧,有问题的话也可以到里面留言哦,ndk吧的链接:
http://tiebabaiducom/fkw=ndk 谢谢!
安卓手机客户端就是可以在安卓手机终端运行的软件。
客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。因特网发展以后,较常用的用户端包括了如万维网使用的网页浏览器,收寄电子邮件时的电子邮件客户端,以及即时通讯的客户端软件等。对于这一类应用程序,需要网络中有相应的服务器和服务程序来提供相应的服务,如数据库服务,电子邮件服务等等,这样在客户机和服务器端,需要建立特定的通信连接,来保证应用程序的正常运行。
0条评论