简单的B/S程序:
服务端程序:
package com.wx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer extends Thread{
//定义服务器接口Server Socket
ServerSocket serverSocket = null;
//定义一个服务器,定义端口
public TcpServer(int port){
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
System.out.println("服务器再启动中。。。等待用户的连接");
while(true){
//建立socket接口,accept方法是一个阻塞进程,等待有用户连接才往下走
try {
Socket socket = serverSocket.accept();
//通过socket对象可以获取输出流,用来写数据
OutputStream OutputStream = socket.getOutputStream();
//向客户端发送消息
OutputStream.write("服务器正在向你发送消息!".getBytes());
//在服务器上显示连接的上的电脑
System.out.println(socket.getInetAddress().getHostAddress()+"连接上了!");
//通过socket对象获得输入流,用来读取用户对象
InputStream inputStream = socket.getInputStream();
//读取数据
int len = 0;
byte[] bytes = new byte[1024];
while((len = inputStream.read(bytes))!=-1){
//直接将获得的数据打印出来
System.out.println("服务器接受的客户端的数据:"+new String(bytes,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//定义服务器监听的端口
int port = 8809;
TcpServer tcp_server = new TcpServer(port);
tcp_server.start();
}
}
客户端程序:
package com.wx.socket;
import sun.reflect.generics.scope.Scope;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient{
//定义一个Socket对象
Socket socket = null;
public TcpClient(String host,int port){
try {
//需要服务器的ip地址和端口号,才能获得正确的Socket对象
socket = new Socket(host,port);
new SendMessThread(socket).start();
int len = 0;
byte[] bytes = new byte[1024];
while((len = socket.getInputStream().read(bytes))!=-1){
System.out.println("客户端接收服务端请求:"+new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//定义主机号
String host = "localhost";
//定义端口号
int port = 8809;
TcpClient tcpClient = new TcpClient(host,port);
}
}
客户端给服务器端发送消息线程
package com.wx.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SendMessThread extends Thread{
Socket socket = null;
public SendMessThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
OutputStream outputStream = null;
try {
outputStream = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
String in = "";
do{
in = scanner.next();
outputStream.write(in.getBytes());
outputStream.flush();
}while(!"byte".equals(in));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
多客户B/S程序
多客户连接服务器,服务器接收客户端发送的消息,给所有的客户端发送,某一个客户端给服务器发送的消息内容
服务器:
package com.wx.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 可以实现和客户端的相互发送消息的交互,可以是多台电脑
*/
public class Server2 extends Thread{
//用来存放连接上的用户的socket对象的值
List<Socket> list = new ArrayList<>();
//定义服务器接口,ServerSocket
ServerSocket serverSocket = null;
public Server2(){}
//定义一个服务器,定义端口
public Server2(int port){
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
try{
while(true){
//建立socket接口,accept方法是一个阻塞进程,等到有用户连接才往下走
//定义soket类
Socket socket = serverSocket.accept();
//在服务器显示连接上的电脑
String message = socket.getInetAddress().getHostAddress().toString();
System.out.println(message+" 连接上了");
//向用户发送消息
sendMessageToAllUser(message);
//将连接上的用户添加到集合里面去
list.add(socket);
//开始新连接用户的线程,用于该可以一直读取数据
new ReaderThread(socket,this).start();
}
}catch (Exception e){
e.printStackTrace();
}
}
//把消息发到每个用户,涉及到写的操作OutputStream
public void sendMessageToAllUser(String message) {
//拿到每个用户的socket对象,对其进行写入数据
for(Socket socket:list){
if(socket !=null && socket.isConnected()){
try{
OutputStream outputStream = socket.getOutputStream();
outputStream.write(message.getBytes());
outputStream.flush();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//定义端口
int port = 8808;
Server2 server2 = new Server2(port);
server2.start();
}
}
服务器中给所有客户发送消息的线程
package com.wx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ReaderThread extends Thread{
InputStream inputStream = null;
Server2 server2 = null;
//这里传入一个socket对象,因为每一个用户都用一个不同的线程存放socket对象进行一直的读取数据
public ReaderThread(Socket socket, Server2 server2){
try {
inputStream = socket.getInputStream();
this.server2 = server2;
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
System.out.println("ReaderThread线程已经开启。。。");
try{
int len = 0;
byte[] bytes = new byte[1024];
while((len = inputStream.read(bytes)) != -1){
server2.sendMessageToAllUser(new String(bytes,0,len));
}
}catch (Exception e){
e.printStackTrace();
}
}
}
客户端:
package com.wx.socket;
import sun.reflect.generics.scope.Scope;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TcpClient{
//定义一个Socket对象
Socket socket = null;
public TcpClient(String host,int port){
try {
//需要服务器的ip地址和端口号,才能获得正确的Socket对象
socket = new Socket(host,port);
new SendMessThread(socket).start();
int len = 0;
byte[] bytes = new byte[1024];
while((len = socket.getInputStream().read(bytes))!=-1){
System.out.println("客户端接收服务端请求:"+new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//定义主机号
String host = "localhost";
//定义端口号
int port = 8808;
TcpClient tcpClient = new TcpClient(host,port);
}
}
客户端给服务器端发送消息线程
package com.wx.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SendMessThread extends Thread{
Socket socket = null;
public SendMessThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
OutputStream outputStream = null;
try {
outputStream = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
String in = "";
do{
in = scanner.next();
outputStream.write(in.getBytes());
outputStream.flush();
}while(!"byte".equals(in));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
来源:CSDN
作者:W厚积薄发
链接:https://blog.csdn.net/Altitude_/article/details/103663987