服务端:
- 1.用指定的端口实例化一个ServerSocket对象。
- 2.调用ServerSocket的accept()方法,以等待连接,并阻塞。
- 3.利用accept()方法返回的Socket对象,进行IO读写操作。
- 4.关闭流,回收资源。
代码实现:
/**
* 基于TCP协议的Socket通信,实现用户登录,服务端
*/
//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket =newServerSocket(10050);//1024-65535的某个端口
//2、调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
//3、获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();
InputStreamReader isr =newInputStreamReader(is);
BufferedReader br =newBufferedReader(isr);
String info =null;
while((info=br.readLine())!=null){
Log.d("MainActivity",Hello,我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//4、获取输出流,响应客户端的请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("Hello World!");
pw.flush();
//5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
客户端:
- 1.用服务端的IP地址和端口实例化Socket对象。
- 2.调用connect方法,连接服务器。
- 3.获得Socket上的流,把流封装进BufferedReader/PrintWriter的实例,以进行读写。
- 4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。
- 5.关闭流,回收资源。
代码实现:
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("ip地址", 10050), 1000);
//获取输入输出流
OutputStream ou = socket.getOutputStream();
//获取输出输出流
BufferedReader bff = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
//向服务器发送信息
ou.write(content.getBytes("utf-8"));
ou.flush();
//读取发来服务器信息
String result = "";
String buffer = "";
while ((buffer = bff.readLine()) != null) {
result = result + buffer;
}
msg.obj = result.toString();
//发送消息 修改UI线程中的组件
myHandler.sendMessage(msg);
//关闭各种输入输出流
bff.close();
ou.close();
socket.close();
} catch (SocketTimeoutException aa) {
//连接超时 在UI界面显示消息
msg.obj = "服务器连接失败!请检查网络是否打开";
//发送消息 修改UI线程中的组件
myHandler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
获取本地Ip的方法:
public static String getIPAddress(Context context) {
NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
try {
//Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
} else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
return ipAddress;
}
} else {
//当前无网络连接,请在设置中打开网络
}
return null;
}
/**
* 将得到的int类型的IP转换为String类型
* @param ip
* @return
*/
public static String intIP2StringIP(int ip) {
return (ip & 0xFF) + "." +
((ip >> 8) & 0xFF) + "." +
((ip >> 16) & 0xFF) + "." +
(ip >> 24 & 0xFF);
}
服务端多线程实现:
- 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接。
- 2.客户端创建一个socket并请求和服务器端连接。
- 3.服务器端接受客户端请求,创建socket与该客户建立专线连接。
- 4.建立连接的两个socket在一个单独的线程上对话。
- 5.服务器端继续等待新的连接。
代码实现:
public class ServerThread extends Thread{
private Socket socket;
//在构造中得到要单独会话的socket
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
InputStreamReader reader = null;
BufferedReader bufReader = null;
OutputStream os = null;
try {
reader = new InputStreamReader(socket.getInputStream());
bufReader = new BufferedReader(reader);
String s = null;
StringBuffer sb = new StringBuffer();
while((s = bufReader.readLine()) != null){
sb.append(s);
}
Log.d("MainActivity","服务器:"+sb.toString());
//关闭输入流
socket.shutdownInput();
//返回给客户端数据
os = socket.getOutputStream();
os.write(("我是服务端,客户端发给我的数据就是:"+sb.toString()).getBytes());
os.flush();
socket.shutdownOutput();
} catch (IOException e2) {
e2.printStackTrace();
} finally{//关闭IO资源
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufReader != null){
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//服务器线程处理 和本线程相关的socket
Socket socket =null;
ServerSocket serverSocket =new ServerSocket(10086);
Socket socket =null;
int count =0;//记录客户端的数量
while(true){
socket = serverScoket.accept();
ServerThread serverThread =new ServerThread(socket);
serverThread.start();
count++;
Log.d("MainActivity","客户端连接的数量:"+count);
}