学习《疯狂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);