Android网络应用学习笔记(一)TCP/IP网络通信

学习《疯狂Android讲义》的记录。

1.使用ServerSocket创建TCP服务器端

 

省略TCP/IP协议概念,直接上代码。
在服务器端运行以下java代码。

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {

	public static void main(String[] args) 
		throws IOException
	{
		// TODO Auto-generated method stub
		{
			//创建一个ServerSocket,用于监听客户端Socket的连接请求
			ServerSocket ss = new ServerSocket(30000);
			//采用循环不断接收来自客户端的请求
			while(true)
			{
				//每当接收到客户端Socket的请求时,服务器端也对应产生一个Socket
				Socket s = ss.accept();
				OutputStream os = s.getOutputStream();
				os.write("您好,您收到了服务器的新年祝福!\n".getBytes("utf-8"));
				//关闭输出流,关闭Socket
				os.close();
				s.close();
			}
		}
	}

}

思考:throws是什么

throws表示此方法不处理异常,而交给方法调用处进行处理

格式一般为

public 返回值类型 方法名称(参数列表,,,)throws 异常类{};

一般配合try...catch...使用

例子如下

class Math{
    public int div(int i,int j) throws Exception{    // 定义除法操作,如果有异常,则交给被调用处处理
        int temp = i / j ;    // 计算,但是此处有可能出现异常
        return temp ;
    }
};
public class ThrowsDemo01{
    public static void main(String args[]){
        Math m = new Math() ;        // 实例化Math类对象
        try{
            System.out.println("除法操作:" + m.div(10,2)) ;
        }catch(Exception e){
            e.printStackTrace() ;    // 打印异常
        }
    }
};

如果在主方法使用了throws关键字,则表示一切异常交给JVM进行处理。默认处理方式也是JVM完成。

此部分参考了博文throw跟throws关键字

 

 2.客户端使用Socket进行通信

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Scanner;

public class MainActivity extends AppCompatActivity {
    EditText show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (EditText) findViewById(R.id.show);
        new Thread()
        {
            @Override
            public void run()
            {
                try
                {
                    //建立连接到远程服务器的Socket
                    Socket socket = new Socket("192.168.1.88",30000);
                    //设置10秒后超时
                    socket.setSoTimeout(10000);
                    //使用Scanner来读取网络输入流中的数据
                    Scanner scan = new Scanner(socket.getInputStream());
                    //读取一行字符
                    String line = scan.nextLine();
                    //将Socket对应的输入流包装成BufferedReaker
                    //BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    //进行普通的IO操作
                    //String line = br.readLine();
                    show.setText("来自服务器的数据:"+line);
                    //关闭输入流、socket
                    //br.close();
                    socket.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

有几点问题:

1)建立Socket使用的构造器此处是Socket(InetAddress/String remoteAddress, int port)

remoteAddress是远程主机地址,port是远程主机端口。远程主机地址就是服务器的IP地址,Windows系统查看IP地址的方法如下。

首先运行cmd控制台,然后输入ipconfig即可看到IP地址等信息。

2)此段代码里其实有两种读取信息的方法

一种是将Socket对应的输入流包装成BufferedReader然后进行普通的IO操作

//将Socket对应的输入流包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//进行普通的IO操作
String line = br.readLine();

一种是使用Scanner来读取网络输入流中的数据

 //使用Scanner来读取网络输入流中的数据
Scanner scan = new Scanner(socket.getInputStream());
//读取一行字符
String line = scan.nextLine();

3)连接超时时长设置

一种方法是使用Socket对象提供的setSoTimeout(int timeout)来设置超时时长,如上面代码所示。

另一种方法是调用Socket对象的connect()方法的同时设置超时时长参数,例如

//创建一个无连接的Socket
Socket s = new Socket();
//让该Socket连接到远程服务器,如果经过10秒还没有连接到,则认为连接超时
s.connect(new InetSocketAddress(host, port), 10000);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐清_hyq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值