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

关于socket tcp/ip的理解

2015-12-08 19:41 666 查看
Http和Socket:http是只有客户端请求服务器才会响应,服务器不能主动发送东西。而socket是双向的,建立连接两边都可以主动发送。

http的两种方法:get和post

socket的:tcp 和udp。tcp,是一种提供可靠数据传输的通用协议,udp是一个面向无连接的协议。

服务器代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class AndroidService {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket ss=new ServerSocket(3000);
while(true){
Socket socket=ss.accept();
new Thread(new runn(socket)).start();
}

}
}
class runn implements Runnable{

Socket socket;
public runn(Socket socket) {
// TODO Auto-generated constructor stub
this.socket=socket;
}
public void run() {
// TODO Auto-generated method stub
String line=null;
InputStream in;
OutputStream out;
String str="hello world";
try {
out=socket.getOutputStream();
in=socket.getInputStream();
BufferedReader bff=new BufferedReader(new InputStreamReader(in));

while((line=bff.readLine())!=null){
System.out.println(line);
out.write(line.getBytes("utf-8"));
}
out.flush();
socket.shutdownOutput();
out.close();
bff.close();
in.close();
socket.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

}


注意,只有调用了socket.shutdownOutput()或者outputStream.flush()时候才会向客户端发送,客户端的也是一样

android客户端代码

package com.example.sockettcpclient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

Socket socket;
String buffer="";
TextView tv;
Button btn;
EditText edt;
String get;
public Handler handler=new Handler() {
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
if(msg.what==0x11){
Bundle bundle=msg.getData();
tv.append("from service:"+bundle.getString("msg")+"\n");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.tv);
btn= (Button) findViewById(R.id.btn);
edt= (EditText) findViewById(R.id.edt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
get = edt.getText().toString();
new MyThread(get).start();
}
});
}
class  MyThread extends Thread{
String text;
public MyThread(String str){
text=str;
}
@Override
public void run() {
Message msg=new Message();
msg.what=0x11;
Bundle bundle=new Bundle();
bundle.clear();
try {
Socket socket=new Socket();
InetSocketAddress address=new InetSocketAddress("10.10.114.3",3000);
socket.connect(address);
OutputStream out=socket.getOutputStream();
out.write(("android客户端"+text).getBytes("utf-8"));
out.flush();
socket.shutdownOutput();
InputStream in=socket.getInputStream();
BufferedReader bff=new BufferedReader(new InputStreamReader(in));
String line=null;
buffer="";
while ((line=bff.readLine())!=null){
buffer=buffer+line;
}

bundle.putString("msg", buffer.toString());
msg.setData(bundle);
handler.sendMessage(msg);
bff.close();
out.close();
in.close();
socket.close();
}catch (SocketTimeoutException e){
e.printStackTrace();
}catch (Exception a){
a.printStackTrace();
}
}
}
}


当然要记得在AndroidManifest.xml加入联网权限。还有,安卓4.0以上都不能在主线程里访问网络
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: