您的位置:首页 > 理论基础 > 计算机网络

Android Socket编程基于TCP实现客户端与服务器简易通信

2018-03-20 15:57 1166 查看

定义:

套接字,是一个对TCP/IP进行封装的API接口,不是网络协议。

分类:

流式Socket(SOCK_STREAM):流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;

数据报式Socket(SOCK_DGRAM)。数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

基于TCP的流式Socket连接实现

Android客户端实现:

public class SocketDeme extends AppCompatActivity implements View.OnClickListener {

private Socket socket;
private EditText et_content;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_socket);
findViewById(R.id.btn_conn).setOnClickListener(this);
findViewById(R.id.btn_send).setOnClickListener(this);
findViewById(R.id.btn_close).setOnClickListener(this);
et_content = (EditText) findViewById(R.id.et_content);

}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_conn:
conn();
break;
case R.id.btn_send:
String msg = et_content.getText().toString().trim();
if (!TextUtils.isEmpty(msg))
send(msg);
break;
case R.id.btn_close:
if (socket.isConnected()){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
break;
}
}

/**
* 建立Socket连接
*/
public void conn() {
new Thread() {
@Override
public void run() {

try {
socket = new Socket("10.20.11.225", 9999);
Log.e("tag", "建立连接");

InputStream is = socket.getInputStream();
DataInputStream reader = new DataInputStream(is);
String msg_service = reader.readUTF();
Log.e("tag","服务端消息: "+msg_service);
} catch (IOException e) {
e.printStackTrace();
}

}
}.start();
}

/**
* 发送消息
* @param msg
*/
public void send(final String msg) {
new Thread() {
@Override
public void run() {
try {
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
writer.writeUTF(msg);

Log.e("tag","我的消息:"+msg);
} catch (IOException e) {
e.printStackTrace();
}

}
}.start();
}

}


服务端实现:

public class SocketServer {

public static void main(String[] args){

startService();
}

/**
* 启动服务监听,等待客户端连接
*/
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);
startReader(socket);
getConsoleMsg(socket);
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 获得控制台输入内容
* @return
*/
private static String getConsoleMsg(final Socket scoket){
String msg = "";
Scanner scan = new Scanner(System.in);
msg = scan.nextLine();
System.out.println("我的信息:"+msg);
sendServiceMsg(scoket,msg);
return msg;
}

/**
* 服务器发送消息
* @param scoket
*/
private static void sendServiceMsg(final Socket scoket,final String msg){
new Thread(){
public void run() {
try {
DataOutputStream dos = new DataOutputStream(scoket.getOutputStream());
dos.writeUTF(msg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}

/**
* 从参数Socket中获取最新消息
* @param socket
*/
private static void startReader(final Socket socket){
new Thread(){
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}

}


运行效果:

服务端

--开启服务器,监听端口 9999 --
--等待客户端连接--
得到客户端连接:Socket[addr=/10.20.11.225,port=60248,localport=9999]
爱我你怕了么
我的信息:爱我你怕了么
--等待客户端连接--
客户端的信息:hehehehehehehe
客户端的信息:pa le


客户端:

E/tag: 建立连接
E/tag: 服务端消息: 爱我你怕了么
E/tag: 我的消息:hehehehehehehe
E/tag: 我的消息:pa le


参考:http://blog.csdn.net/wanxuedong/article/details/54865288
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐