一、单个用户进行连接
1.客户端
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/*
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
*/
public class ClientDemo1 {
public static void main(String[] args) throws Exception{
// 1:建立客户端的Socket服务,并明确要连接的服务器。
//Socket(String host, int port)
//创建流套接字并将其连接到指定主机上的指定端口号。
Socket socket = new Socket("192.168.22.15", 12345);
Scanner sc = new Scanner(System.in);
// 3:通过Socket对象的方法,可以获取这两个流
//获取通道中的输出流,将数据发送给服务端
OutputStream outputStream = socket.getOutputStream();
//获取通道中的输入流
InputStream inputStream = socket.getInputStream();
while (true){
System.out.print("请输入要发送的内容:");
String info = sc.nextLine();
if("886".equals(info)){
break;
}
// 4:通过流的对象可以对数据进行传输
outputStream.write(info.getBytes());
outputStream.flush(); // 来自于通道中的类
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(s);
}
// 5:如果传输数据完毕,关闭资源
// outputStream.close();
socket.close();
}
}
2.服务端
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
*/
public class ServerDemo1 {
public static void main(String[] args){
try {
// 1:建立服务器端的socket服务,需要一个端口
//ServerSocket(int port)
//创建绑定到指定端口的服务器套接字。
ServerSocket ss = new ServerSocket(12345);
// 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
Socket socket = ss.accept();
while (true){
InetAddress inetAddress = socket.getInetAddress();
String hostName = inetAddress.getHostName();
// 3:通过客户端的获取流对象的方法,读取数据或者写入数据
// 获取通道中的输入流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(hostName+": "+s);
// 获取通道中的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器已接收!".getBytes());
outputStream.flush();
}
}catch (Exception e){
System.out.println("用户已退出。。。");
}
}
}
二、建立多个客户的连接
1.客户端
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/*
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
*/
public class ClientDemo1 {
public static void main(String[] args) throws Exception {
// 1:建立客户端的Socket服务,并明确要连接的服务器。
//Socket(String host, int port)
//创建流套接字并将其连接到指定主机上的指定端口号。
Socket socket = new Socket("192.168.22.15", 12345);
Scanner sc = new Scanner(System.in);
// 3:通过Socket对象的方法,可以获取这两个流
//获取通道中的输出流,将数据发送给服务端
OutputStream outputStream = socket.getOutputStream();
//获取通道中的输入流
InputStream inputStream = socket.getInputStream();
// E:\\李刚的对象.jpg
BufferedInputStream bis = null;
while (true){
try {
System.out.print("请输入要上传文件的路径:");
String address = sc.nextLine();
bis = new BufferedInputStream(new FileInputStream(address));
break;
}catch (Exception e){
System.out.println("路径不存在!重新输入!");
}
}
if(bis!=null){
byte[] bytes = new byte[2048];
int length = 0;
while ((length = bis.read(bytes))!=-1){
// 4:通过流的对象可以对数据进行传输
outputStream.write(bytes,0, length);
outputStream.flush(); // 来自于通道中的类
}
}
//关闭输出流,通知服务端读取结束
socket.shutdownOutput();
// 接收服务端的反馈
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(s);
// 5:如果传输数据完毕,关闭资源
// outputStream.close();
socket.close();
}
}
2.服务端
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
*/
public class ServerDemo1 {
public static void main(String[] args) throws Exception{
// 1:建立服务器端的socket服务,需要一个端口
//ServerSocket(int port)
//创建绑定到指定端口的服务器套接字。
ServerSocket ss = new ServerSocket(12345);
while (true){
// 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
Socket socket = ss.accept();
new TCPThread(socket).start();
}
}
}
class TCPThread extends Thread{
Socket socket;
public TCPThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InetAddress inetAddress = socket.getInetAddress();
String hostName = inetAddress.getHostName();
System.out.println("用户:"+hostName+" 已上线! ");
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\target\\" + hostName + "-" + System.currentTimeMillis() + ".jpg"));
while (true) {
// 3:通过客户端的获取流对象的方法,读取数据或者写入数据
// 获取通道中的输入流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[2048];
int length = 0;
while ((length = inputStream.read(bytes))!=-1){
// 4:通过流的对象可以对数据进行传输
bos.write(bytes,0, length);
bos.flush(); // 来自于通道中的类
}
// 获取通道中的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("图片已上传!!".getBytes());
outputStream.flush();
}
}catch (Exception e){
System.out.println("-----------------------");
System.out.println(hostName+" 用户已下线....");
System.out.println("-----------------------");
}
}
}
标签:协议,java,socket,tcp,传输,new,import,Socket,客户端
From: https://www.cnblogs.com/ndmtzwdx/p/18475860