Java Socket建立连接和发送消息

通信协议


1.上层协议

       http,ftp,https

2.底层协议

       TCP/IP
       TCP:安全度更高,一般没有数据丢失
       UDP:效率更快,安全性相对低,可能会有数据丢失
       拓展: HTTP头:只是在TCP协议里面附带的一段内容
       
       总结:所谓的协议就是在数据传输基础上封装自己的文本内容

3.Java里的TCP/IP实现——Socket

       Socket实现了TCP/IP,TCP/IP只是一份文档,各个不同的语言根据自己的需求对这个协议进行不同的解析,而在JAVA里对TCP/IP的解析实现就是Socket。
       

Socket开发


1.建立连接

        1) Socket 实现了TCP/IP协议,可以连接到网络上的上脑,并收发数据
        2) ServerSocket 用于服务端,可以监听服务端口,等待客户端连接,连接后可以生成用于传输数据的Socket
        3) 创建服务端
            ServerSocket serverSocket = new ServerSocket(9999);
            Socket socket =  serverSocket.accept();  //等待客户端连接
        4) 创建客户端
            Socket socket = new Socket("100.100.28.26", 9999);
            // 注意:注册网络权限;不能在主线程做网络连接
        5) 客户端发送消息
            DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
            writer.writeUTF("嘿嘿,你好啊,服务器..");  // 写一个UTF-8的信息
        6) 服务端接收消息
            DataInputStream reader = new DataInputStream( socket.getInputStream());
            String msg = reader.readUTF();
        7)  服务器等待说明
          Java Socket建立连接和发送消息_第1张图片

2.客户端、服务端具体实现

1)客户端
package com.example.socketclient;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

/**
 * 客户端
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	private Socket socket;

	/** 
	 * 建立服务端连接 
	 */
	public void conn(View v) {
		new Thread() {

			@Override
			public void run() {

				try {
					socket = new Socket("100.100.28.26", 9999);
					Log.e("JAVA", "建立连接:" + socket);
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

	/** 
	 * 发送消息
	 */
	public void send(View v) {
		new Thread() {
			@Override
			public void run() {

				try {
					// socket.getInputStream()
					DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
					writer.writeUTF("嘿嘿,你好啊,服务器.."); // 写一个UTF-8的信息
					
					System.out.println("发送消息");
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

}

2)服务端
package com.example.socketserver;

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

/**
 * 服务端
 *
 */
public class SocketServer{

	public static void main(String[] args) {
		startService();
	}

	/** 
	 * 启动服务监听,等待客户端连接
	 */
	private static void startService() {
		try {
			// 创建ServerSocket
			ServerSocket serverSocket = new ServerSocket(9999);
			System.out.println("--开启服务器,监听端口 9999--");

			// 监听端口,等待客户端连接
			while (true) {
				System.out.println("--等待客户端连接--");
				Socket socket = serverSocket.accept(); //等待客户端连接
				System.out.println("得到客户端连接:" + socket);
				
				startReader(socket);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/** 
	 * 从参数的Socket里获取最新的消息
	 */
	private static void startReader(final Socket socket) {

		new Thread(){
			@Override
			public void run() {
				DataInputStream reader;
				try {
					// 获取读取流
					reader = new DataInputStream( socket.getInputStream());
					while (true) {
						System.out.println("*等待客户端输入*");
						// 读取数据
						String msg = reader.readUTF();
						System.out.println("获取到客户端的信息:" + msg);
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

}

3.下来我们运行Demo来看一看效果

Java Socket建立连接和发送消息_第2张图片

项目源码,点击下载

你可能感兴趣的:(java,socket,TCPIP实现)