关于socket tcp/ip的理解

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以上都不能在主线程里访问网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值