转载请注明出处:http://blog.csdn.net/joker_ya/article/details/40214627
最近呢,比较烦。快要毕业了,各种事情堆压过来。让人有点喘不过气来,刚好今天有点空就写下了这篇有关Socket编程的博客。由于时间匆忙没有好好去弄,因此该应用非常简单,大家看看就好了。嘛!最主要的还是原理。只要弄懂了原理编写有关Socket方面的不是得心应手!
Socket :Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
Socket简介(百度百科):Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket 连接过程(百度百科):根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务类
*
* @author Joker_Ya
*
*/
public class SocketServer {
// 端口号
private static final int PORT = 5252;
// ServerSocket类
private ServerSocket mServerSocket;
private Socket mSocket;
private BufferedReader in;
// private PrintWriter out;
public static void main(String[] args) {
// TODO Auto-generated method stub
new SocketServer();
}
public SocketServer() {
super();
// TODO Auto-generated constructor stub
try {
mServerSocket = new ServerSocket(PORT);
System.out.println("------Server Satrted------");
mSocket = mServerSocket.accept();
in = new BufferedReader(new InputStreamReader(
mSocket.getInputStream()));
// out = new PrintWriter(mSocket.getOutputStream(), true);
String line = in.readLine();
System.out.println("you sent is " + line);
// out.close();
in.close();
mSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
界面布局很简单,这里就不给出来了。界面只含有一个TextView、一个EditView和一个Button。Button用于将用户输入到EditView里的内容用Socket发送出去,服务器接收到内容后在控制台打印内容。
主Activity文件MainActivity.java:
package com.example.sockitdemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
* 客户端
*
* @author Joker_Ya
*
*/
public class MainActivity extends ActionBarActivity {
private EditText mEditText;
private Button mButton;
private static final String HOST = "222.17.106.37";
private static final int PORT = 5252;
private Socket socket;
private PrintWriter out;
// private BufferedReader in;
private String getText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.editText);
mButton = (Button) findViewById(R.id.send_bt);
//开启新线程访问网络,否则会报错
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
socket = new Socket(HOST, PORT);
// in = new BufferedReader(new InputStreamReader(
// socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(),
"utf-8")), true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
// 按钮点击事件
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
getText = mEditText.getText().toString();
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(getText);
}
}
}
});
}
}
最后不要忘了在清单文件中加入访问网络的权限:
首先运行服务器文件SocketServer.java,运行后会在控制台出现如下图所示内容:
该图说明服务器已经启动。接下来运行Android应用SocketDemo,并在输入框输入内容和发送内容。如下图:
当点击“发送”按钮时,可以在控制台查看是否得到了内容和打印出内容:
好了,一个简单的Socket应用就完成了。大家理解其原理了没有?!ps:由于没有设置编码格式。所以当输入中文时,控制台打印的是乱码。而且也没有循环监控,所以只打印一次。匆忙之中赶的,望谅解!!谢谢