三月13日 网络编程2-TCP(略看)
TCP传输:
Socket(客户端)和ServerSocket(服务端)
建立客户端和服务端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
1.客户端:
该对象建立时就可以连接指定的主机,TCP是面向连接的,所以在建立SOcket服务时,就要
有服务端存在
形成通路后进行数据的传输
步骤:
创建Socket服务。并指定要连接的主机和端口 Socket(Address , sort) 通路建立~通路
一建立就有Socket流。
getOutputStream
getInputStream
2.获取是Socket流中的输出流
3.write方法写入
2.服务端:
1.建立服务端 ServerSocket(绑定端口)给服务端打数字标识
2.获取连接过来的客户端对象 通过ServerSocket的accept方法完成。没有连接就
会wait所以这个方法是阻塞式的 返回Socket类
3.客户端发过来数据,服务端使用对应的客户端对象,并获取客户端对象的读取流
4.(可选)关闭服务端
import java.io.OutputStream;
import java.net.Socket;
//写一个客户端,将数据发给服务器端
public class TCPCilent
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.6",24587);
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le!!".getBytes());
s.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//将接收到的数据打印在控制台上
public class TCPServer
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(24587);
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len = is.read(buf))!= -1)
{
String str = new String(buf,0,len);
System.out.println(str);
}
s.close();
}
}
TCP传输过程中,客户端和服务端的互访
需求:客户端给服务端发数据,服务端给客户端反馈
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TCPServer
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(19906);
Socket s = ss.accept();
InputStream in = s.getInputStream();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"........connected");
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();
out.write("服务端收到信息!!!!".getBytes());
s.close();
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TCPCilent
{
public static void main(String[] args) throws UnknownHostException,
IOException
{
Socket s = new Socket("192.168.1.6",19906);
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
out.write("测试数据是否传送到服务端,服务端收到请回
话!!".getBytes());
InputStream in = s.getInputStream();
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
//客户端写入数据,服务端将其转换为大写,并返回客户端
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
//客户端写入数据,服务端将其转换为大写,并返回客户端
//服务端
public class TCPServer
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(9127);
Socket s = ss.accept();
//从客户端写入的数据流
BufferedReader bfIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//发往客户端的大写字母数据
BufferedWriter bfOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = bfIn.readLine()) != null)
{
bfOut.write(line.toUpperCase());
bfOut.newLine();
bfOut.flush();
}
s.close();
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端写入数据,服务端将其转换为大写,并返回客户端
//客户端
public class TCPCilent
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket s = new Socket("192.168.1.6",9127);
//通过键盘录入的数据流
BufferedReader bfr =
new BufferedReader(new InputStreamReader(System.in));
//读取服务端发来的大写字母流
BufferedReader bfIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//发给服务端的数据流
BufferedWriter bfOut =
new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = bfr.readLine()) != null)
{
if("over".equals(line))
break;
bfOut.write(line);
bfOut.newLine();
bfOut.flush();
String str = bfIn.readLine();
System.out.println("server: "+str);
}
bfr.close();
s.close();
}
}
shutdownOutput 关闭客户端输出流,相当于给流注入了一个结束标记
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
//通过客户端上传文件,服务端为其复制文件,并反馈回执给客户端
//服务端
public class TCPServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10091);
Socket s = ss.accept();
//从客户端传入的数据
InputStream isIn = s.getInputStream();
//复制后的文件
OutputStream os = new FileOutputStream("G:\\myCopy.exe");
//发给客户端的回执
OutputStream osOut = s.getOutputStream();
byte[] buf = new byte[1024*20];
int len = 0;
while((len = isIn.read(buf)) != -1)
{
os.write(buf, 0, len);
}
osOut.write("上传成功!!!!!".getBytes());
ss.close();
s.close();
os.close();
}
}
/*********************************************************/
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//通过客户端上传文件,服务端为其复制文件,并返回给客户端
//客户端
public class TCPCilent
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.6",10091);
//从本机获取的文件数据
InputStream is = new FileInputStream("G:\\1.exe");
//上传给服务端的数据
OutputStream osOut = s.getOutputStream();
//从服务端获取的数据
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
byte[] buf = new byte[1024*20];
int bt = 0;
while((bt = is.read(buf)) != -1)
{
osOut.write(buf,0,bt);
}
s.shutdownOutput();
String str = bufIn.readLine();
System.out.println(str);
bufIn.close();
s.close();
is.close();
}
}