基于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服务端
- 服务器建立通信ServerSocket
- 服务器建立Socket接收客户端连接
- 建立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客户端
- 创建Socket通信,设置通信服务器的IP和Port
- 建立IO输出流向服务器发送数据消息
- 建立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编程的主要内容,如果未能解决你的问题,请参考以下文章