关于socket tcp/ip的理解

来源:互联网 发布:战争程序员白濑 动漫 编辑:程序博客网 时间:2024/05/21 19:34

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 stubthis.socket=socket;}public void run() {// TODO Auto-generated method stubString 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 exceptione.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以上都不能在主线程里访问网络

0 0
原创粉丝点击