一、简单的demo

(1)客户端

package com.songyan.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class Demo_Client {
/**
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//创建socket
Socket socket=new Socket("127.0.0.1",12345);
//创建输入流
InputStream in=socket.getInputStream();
//创建输出流
OutputStream out=socket.getOutputStream(); //接受服务器返回的数据
byte[] respo=new byte[1024];
int len =in.read(respo);
System.out.println(new String(respo,0,len)); out.write("学习计算机哪家强".getBytes());
} }

(2)服务器端

package com.songyan.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/ public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
//接受客户端的请求
Socket socket=serversocket.accept();
//获取输入流
InputStream in=socket.getInputStream();
OutputStream out =socket.getOutputStream();
//服务器向客户端写数据
out.write("百度一下你就知道".getBytes()); //服务器读取客户端发送的请求
byte[] respo=new byte[1024];
int len =in.read(respo);
System.out.println(new String(respo,0,len));
}
}

(3)运行

在bin目录下(按住shift右键----在此处打开命令行窗口)

输入start打开另一个窗口

在其中一个窗口,先运行服务器端的程序

在另一个窗口运行客户端的程序

二、TCP代码优化(输入字符串/一行)

(1)客户端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException; public class Demo2_Client {
/**
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//创建socket
Socket socket=new Socket("127.0.0.1",12345);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//接受服务器返回的数据
System.out.println(br.readLine());
ps.println("我想报名");
System.out.println(br.readLine()); } }

(2)服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo2_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/ public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
//接受客户端的请求
Socket socket=serversocket.accept();
//获取输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//服务器向客户端写数据
ps.println("欢迎访问黑马程序员");
System.out.println(br.readLine());
ps.println("爆满了"); }
}

三、服务端是多线程的

多线程的时候只需要修改服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo3_server {
/*2.服务端
* com/songyan/tcp/Demo_server.java
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流*/public static void main(String[] args) throws IOException {
//创建socket
ServerSocket serversocket=new ServerSocket(12345);
while(true)
{
final Socket socket=serversocket.accept();
new Thread(){
public void run(){
try {
//接受客户端的请求 //获取输入流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//服务器向客户端写数据
ps.println("欢迎访问黑马程序员");
System.out.println(br.readLine());
ps.println("爆满了");
} catch (IOException e) {
e.printStackTrace();
}
} }.start();
}
}
}

练习题1, 客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串

(1)客户端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner; public class Demo5_Client {
public static String reversel(String str){
return new StringBuffer(str).reverse().toString();
}
/*客户端向服务器写字符串(键盘录入)*/
public static void main(String[] args) throws IOException {
//创建Socket
Socket socket=new Socket("127.0.0.1",12346);
//获取输入流,输出流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//接受服务器的数据
String message=br.readLine();
System.out.println(reversel(message));
//再次向客户端发送数据
Scanner in=new Scanner(System.in);
ps.println(in.nextLine());
message=br.readLine();
System.out.println(reversel(message));
ps.println(in.nextLine()); }
}

(2)服务器端

package com.songyan.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Demo5_server {
/*服务器(多线程)将字符串反转后写回,
* 客户端再次读取到是反转后的字符串*/
public static void main(String[] args) throws IOException {
//创建服务器端socket
ServerSocket serverSocket=new ServerSocket(12346);
//获取客户端的输入
final Socket socket=serverSocket.accept();
new Thread(){
public void run()
{
//获取输入流对象,输出流对象
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
//输出数据给客户端
Scanner in=new Scanner(System.in);
ps.println(in.nextLine());
System.out.println(br.readLine());
ps.println(in.nextLine());
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
} }.start(); }
}

练习题2, 客户端向服务器上传文件

(1)客户端

package com.songyan.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; import javax.xml.ws.handler.MessageContext.Scope; public class Demo1_Client {
public static File getFile()
{
System.out.println("请输入文件路径");
Scanner sc=new Scanner(System.in);
String path=sc.nextLine(); //获取文件路径
File file=new File(path); //文件名封装成文件
while(true)
{
if(!file.exists())
{
System.out.println("文件不存在,请重新输入");
}else if(file.isDirectory())
{
System.out.println("您输入的是文件夹名称,请输入文件名称");
}else{
return file;
}
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
//提示输入上传的文件路径,判断路径是否存在,是否是文件夹
File file=getFile();
//发送文件名到服务端
Socket socket=new Socket("127.0.0.1",12345);
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps=new PrintStream(socket.getOutputStream());
ps.println(file.getName());
//接受结果
String result=br.readLine();
//如果存在,给予提示,程序直接退出
if("存在".equals(result))
{
System.out.println("文件已存在");
socket.close();
return;
}else{
//如果不存在,定义FileInputStream读取文件,写出到网络
FileInputStream fileIn=new FileInputStream(file);
byte[] arr=new byte[8192];
int len;
while((len=fileIn.read(arr)) != -1)
{
ps.write(arr,0,len);
}
fileIn.close();
socket.close(); } }
}

(2)服务器端

package com.songyan.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket; public class Demo1_Server {
public static void main(String[] args) throws IOException {
//建立多线程服务器
ServerSocket server=new ServerSocket(12345);
//读取文件名
while(true)
{
final Socket socket= server.accept();
new Thread(){
public void run()
{
try {
InputStream in= socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
PrintStream ps=new PrintStream(socket.getOutputStream());
String filename=br.readLine();
//判断文件是否存在,结果返回给客户端
File dir=new File("path");
dir.mkdir();
File file=new File(dir,filename);
if(file.exists())
{
ps.println("存在");
socket.close();
return;
}else{
ps.println("不存在");
}
//定义FileOutputStream,从网络读取数据存储到本地
FileOutputStream out=new FileOutputStream(file);
byte[] arr= new byte[8192];
int len ;
while((len=in.read(arr))==-1)
{
out.write(arr,0,len);
}
out.close();
socket.close(); } catch (IOException e) {
e.printStackTrace();
} } }.start(); }
}

运行后在项目的根路径下就会创建path文件夹,文件夹中就会包括上传的文件(这里这个文件夹就是模拟的服务器中的文件夹)

网络编程-tcp的更多相关文章

  1. GO语言练习:网络编程 TCP 示例

    1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...

  2. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  3. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  4. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  5. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  6. Socket网络编程-TCP编程

    Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...

  7. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  8. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

  9. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

  10. 网络编程TCP/IP实现客户端与客户端聊天

    一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/I ...

随机推荐

  1. docker compose,link,Odoo

    1.报错: /usr/bin/docker-current: Error response from daemon: driver failed programming external connec ...

  2. Planning your upgrade with Upgrade Advisor

    Planning your upgrade with Upgrade Advisor You should use the Upgrade Advisor tool (if it is availab ...

  3. jquery实现通用结构折叠面板效果

    效果截图: 说明:可以任意添加多个类似结构样式,点击标题栏图片对应隐藏.显示. jquery代码: 思路一:基本方法 <script src="http://apps.bdimg.co ...

  4. POJ1220(大数进制转换)

    NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4652   Accepted: ...

  5. Linux MMC介绍

    1. 介绍 Linux中,将包括MMC.SD.SDIO统称为MMC子系统 MMC子系统从功能上可分为三个层次 - card层: Card驱动, 或称client驱动 - core层: MMC的核心层, ...

  6. python实战===一行代码就能搞定的事情!

    打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...

  7. ANSI、ASCII、Unicode和UTF-8编码

    来自:http://blog.163.com/yang_jianli/blog/static/161990006201371451851274/ --------------------------- ...

  8. 使用JQuery解析、处理JSON数据(应用在课程表)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. hdu5079

    这道题的难点在于思考dp表示什么 首先可以令ans[len]表示白色子矩阵边长最大值大于等于len的方案数则ans[len]-ans[len+1]就是beautifulness为len的方案数 白色子 ...

  10. PHP的文件操作类

    <?php class file { function file() { die("Class file can not instantiated!"); } //创建目录 ...