今天基于eclipse构建了一个简单的服务器端,完成了客户端和服务器端的简单通信,下面记录一下自己学习的成果。
Socket,俗称套接字,相当于一个接口,一个服务器有很多接口,提供很多服务,每一种服务对应一个scoket,服务器就像一个插座,socket就像一个插头,对应的socket去匹配对应的服务器接口。Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,一组接口。Socket用于描述ip地址和端口,是一个通信的句柄。
服务器端对应socket:
ServerSocket:服务器的接口,另外必须定义一个socket来接收服务器端获得的socket。
客户端对应socket:
Socket:用于传输及获得数据。
关于socket的构造方法,如果有不懂的同学请自行查阅,这里就不过多叙述了。下面开始贴代码~
服务器端(使用的是eclipse for javaee版本,tomcat为服务器,java语言编写)
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class MyServer {
- public static void main(String[] args) {
- try {
- ServerSocket server = new ServerSocket(8899);
- while (true) {
- System.out.println("execute 1\n");
- Socket client = server.accept();
- System.out.println("execute 2\n");
- OutputStream out = client.getOutputStream();
- System.out.println("execute 3\n");
- String msg = "hello android";
- out.write(msg.getBytes());
- System.out.println("execute 4\n");
- client.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
成功运行如上图所示,服务器已经开启
下面是android客户端的代码,由于布局很简单,我就不贴了,就两个控件,一个按钮一个textview。
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
button = (Button) findViewById(R.id.httppost);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启新线程进行网络通信
new Thread(new Runnable() {
@Override
public void run() {
Socket socket= null;
try {
//新建socket参数一为你电脑的ip地址,参数二为端口号
socket = new Socket("10.16.224.147",8899);
Log.e("socket","success");
//得到客户端传来的输入流
InputStream inputStream=socket.getInputStream();
//读取数据
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder=new StringBuilder();
String line="";
if ((line=bufferedReader.readLine())!=null){
builder.append(line);
}
inputStream.close();
Message message=new Message();
message.what=1;
message.obj=builder.toString();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
//线程接收完毕数据后更新textview的内容
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==1){
textView.setText(msg.obj.toString());
}
}
};
}
}
效果如图,一开始的时候:
点击按钮后
以及点击按钮后的服务器端的变化情况: