基于java的socket编程

Posted Heavy sea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于java的socket编程相关的知识,希望对你有一定的参考价值。

一、 Socket 通信简介

Java Socket 可实现客户端–服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。
socket 通信具体原理见前面转载的博文socket,tcp,http三者之间的区别和原理,原文点击这里

二、基于java的socket编程思路

思路:前面在学习基于Linux C的socket网络编程时详细讲过思路,详情点击网络编程(基于TCP的scoket网络编程)
虽然现在是java平台,但整体思路不外乎服务端先建立套接字,再绑定相应的IP地址和端口号,然后等待客户端的连接请求。客户端同样建立套接字并绑定好与服务端约定好的IP地址与端口号,然后双方进行通信。

三、java socket服务端

1.简单的socket服务端

  1. 服务器建立通信ServerSocket
  2. 服务器建立Socket接收客户端连接
  3. 建立IO输入流读取客户端发送的数据

根据思路写出服务端代码
注意: 如果运行时无法绑定到端口,抛出异常,一般来说是因为端口被占用。
如果主机只有一个IP 地址, 那么默认情况下, 服务器程序就与该IP 地址绑定。(比如下面的代码就默认与我的电脑的IP地址绑定)
若想绑定其他的IP地址,ServerSocket 有一个构造方法 ServerSocket(int port, int backlog, InetAddress bingAddr), 有一个 bindAddr 参数, 它显式指定服务器要绑定的IP 地址, 该构造方法适用于具有多个IP 地址的主机。

package com.heavysea.l;

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


// 服务端
public class Test {
	public static void main(String[] args) {
		byte []data = new byte[128];
		int len = 0;
		
		try {
			// 绑定端口号
			ServerSocket socket = new ServerSocket(8801);
			System.out.println("socket 套接字创建完毕,等待连接");
			Socket con = socket.accept();
			System.out.println("有客户端接入");
			// 获取输入流 用来读取数据
			InputStream in = con.getInputStream();
			len = in.read(data);
			System.out.println("读到消息:"+ new String(data,0,len));
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

2.多线程的socket服务端

编写完基本的socket服务端程序,若想服务端能与多个客户端接入,则需要创建线程。即socket套接字创建完毕,不停地等待客户端接入,若有客户端接入,则创建线程与客户端通信,而主线程仍然在等待别的客户端接入。

代码:

package com.heavysea.l;

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

// 服务端
public class Test2 {
	public static void main(String[] args) {

		try {
			// 绑定端口号
			ServerSocket socket = new ServerSocket(8803);
			System.out.println("socket 套接字创建完毕,等待连接");

			while (true) {
				final Socket server = socket.accept();
				System.out.println("有客户端接入");
				new Thread(new Runnable() {

					public void run() {
						// TODO Auto-generated method stub
						byte[] data = new byte[128];
						int len = 0;
						InputStream in;
						try {
							while (true) {
								in = server.getInputStream();
								len = in.read(data);
								System.out.println("读到消息:"
										+ new String(data, 0, len));
							}
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}

					}
				}).start();

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

三、java socket客户端

  1. 创建Socket通信,设置通信服务器的IP和Port
  2. 建立IO输出流向服务器发送数据消息
  3. 建立IO输入流读取服务器发送来的数据消息
package com.heavysea.l;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Test3 {
	public static void main(String[] args) {

			try {
				Socket client = new Socket("192.168.43.241",8003);
				OutputStream out = client.getOutputStream();
				// 获取键盘输入
				Scanner sc = new Scanner(System.in);
				String message = sc.nextLine();
				// 写入数据
				out.write(message.getBytes());
				
				// 读出数据
				int len = 0;
				byte []data = new byte[128];
				InputStream in = client.getInputStream();
				len = in.read(data);
				System.out.println("获取数据"+new String(data,0,len));
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}
}

以上是关于基于java的socket编程的主要内容,如果未能解决你的问题,请参考以下文章

基于java的socket编程

基于Socket的java网络编程

Java网络编程基础-- 基于TCP/IP的Socket编程

基于java的socket简单聊天编程

基于java的socket编程及API解析

基于Socket的低层次Java网络编程