基于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();
			}
			
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ArrayList Threader = new ArrayList(); private static LinkedList Message_Array = new LinkedList(); private static int Thread_Counter = 0; private static boolean isClear = true; protected static final int SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = new FileOutputStream( "d:/connect.log", true); public Server() throws FileNotFoundException, IOException { super(SERVER_PORT); // append connection log // Calendar now = Calendar.getInstance(); // String str = "[" + now.getTime().toString() + // "] Accepted a connection"; // byte[] tmp = str.getBytes(); // LOG_FILE.write(tmp); try { Socket socket = accept(); while (true) { new ServerReaderThread(socket); new ServerWriterThread(socket); } } finally { close(); } } public static void main(String[] args) throws IOException { new Server(); } // --- CreateServerThread class ServerReaderThread extends Thread { private Socket client; private BufferedReader in; private PrintWriter out; private String Username; public ServerReaderThread(Socket s) throws IOException { client = s; in = new BufferedReader(new InputStreamReader(client .getInputStream())); out = new PrintWriter(client.getOutputStream(), true); start(); } public void run() { try { int flag = 0; Thread_Counter++; String line = in.readLine(); while (!line.equals("bye")) { out.println(line); line = in.readLine(); } out.println("--- See you, bye! ---"); // System.out.println("--- See you, bye! ---"); client.close(); } catch (IOException e) { } finally { try { client.close(); } catch (IOException e) { } Thread_Counter--; } } } // --- CreateServerThread class ServerWriterThread extends Thread { priva

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值