(禁止转载)
一直对设计网络的编程不太熟悉,无奈毕设要用,简单了解一下。
socket: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
以下是一个基于android与服务器之间通信的简单实例,服务器端采取java编写。
服务器和android设备之间可以双向发送接收消息,服务器接收到android设备的消息后会直接打印在终端内,服务器也支持直接在终端内输入消息回车发送给客户端。
android客户端支持连接服务器,自主编写发送给服务器的消息。但接收消息只能再控制台上看到。原因是因为调试了很久发现的一个问题,即就是android编程不能在线程中对UI进行直接操作,具体的操作方法可以使用Handler等方式。(由于自己的设计和这个关系不大,因而暂不关注这个了。)
具体运行如下:
服务器端表现:
android端表现:
android.png具体代码如下,可能有一些冗余并未注意,所以如果要使用还需要再编辑一下。
服务器:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* 服务端
*
*/
public class SocketServer{
public static void main(String[] args) {
startService();
System.out.println("断点1");
}
/**
* 启动服务监听,等待客户端连接
*/
private static void startService() {
try {
// 创建ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("--开启服务器,监听端口 9999--");
// 监听端口,等待客户端连接
while (true) {
//System.out.println("--等待客户端连接--");
Socket socket = serverSocket.accept(); //等待客户端连接
System.out.println("得到客户端连接:" + socket);
send(socket);
startReader(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从参数的Socket里获取最新的消息
*/
private static void startReader(final Socket socket) {
new Thread(){
@Override
public void run() {
DataInputStream reader;
try {
// 获取读取流
reader = new DataInputStream( socket.getInputStream());
while (true) {
//System.out.println("*等待客户端输入*");
// 读取数据
String msg = reader.readUTF();
System.out.println("获取到客户端的信息:" + msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
public static void send(final Socket socket) {
new Thread() {
@Override
public void run() {
try {
// socket.getInputStream()
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
try
{
while(true){
BufferedReader bt=new BufferedReader(new InputStreamReader(System.in));
String s=bt.readLine();
System.out.println("发送至客户端:"+s);
writer.writeUTF(s); // 写一个UTF-8的信息
}
}
catch(java.io.IOException ex)
{
System.out.println(ex.getMessage());
}
System.out.println("发送消息");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
android端:
package com.example.island.socketexample;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
/**
* 客户端
*
*/
public class MainActivity extends Activity {
EditText txt1;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt1 = (EditText)findViewById(R.id.Editxt);
read();
}
private static Socket socket;
/**
* 建立服务端连接
*/
public void conn(View v) {
new Thread() {
@Override
public void run() {
try {
socket = new Socket("10.180.31.160", 9999);
Log.e("JAVA", "建立连接:" + socket);
index = 1;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 发送消息
*/
public void send(View v) {
new Thread() {
@Override
public void run() {
try {
// socket.getInputStream()
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
String str = txt1.getText().toString();
writer.writeUTF(str); // 写一个UTF-8的信息
System.out.println("发送消息:"+str);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 从参数的socket里获取最新的消息
* @param socket
*/
public void read( ) {
new Thread(){
@Override
public void run() {
while(true) {
if(index==1) {
try {
// 获取读取流
DataInputStream reader = new DataInputStream(socket.getInputStream());
while (true) {
System.out.println("接收消息");
// 读取数据
String msg = reader.readUTF();
System.out.println("接收到服务器的消息:"+msg);
//txt2.setText("受到消息");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
}
}
android 客户端 界面:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_margin="20dp" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="conn"
android:text="建立连接" />
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="请在此输入你要发送的内容..."
android:id="@+id/Editxt"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="send"
android:text="发送消息" />
</LinearLayout>
另外还要注意再AndroidManifest中取得联网许可
QQ截图20170306223059.png
网友评论