一,了解之前先了解一下网络基础

首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程

一般的网络编程都称为Socket编程,Socket的英文意思是“插座”

网络编程的目的:直接或者间接的通过网络协议与其他计算机进行通信。

网络编程中有两个主要的问题:

-->如何准确定为网络上一台或者多台主机:IP和端口号

-->找到主机后如何可靠搞笑的进行数据传输:Tcp/Ip 协议(四层)

二,网络通信要素

网络通信要素1:IP地址,通过Ip,可以唯一的定为互联网上的一台主机

    ip地址唯一定为一台主机,而端口号定为主机上的某一个正在运行的软件

通讯要素2:网络通信协议TCP/IP协议

三,TCP编程案例1:客户端给服务端发消息,服务端输出此消息到控制台

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str+"\n");
System.out.println("收到来自"+st.getInetAddress().getHostAddress()+"的请求并已回应");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

TCP编程案例2:客户端给服务端发消息,服务端输出此消息到控制台,同时发送已收到信息给客户端

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
InputStream is = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
//声明给服务端发送的东西完毕
socket.shutdownOutput();
//接收服务端的回应
is = socket.getInputStream();
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
OutputStream outputStream = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
// if(st.isInputShutdown()) {
//给予客户端回应
outputStream = st.getOutputStream();
outputStream.write("我已经收到,这是给你(客户端)的回应哦".getBytes());
// }
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

一般关流的时候,遵循从后往前的顺序。

案例3:从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 16:21
*/
//从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接
//注意:本案例中的关流等操作都应该使用try...catch...finally 而不能使用throws Exception 本案例只是为书写方便~

public class socketTomcat {
//客户端
@Test
public void client() throws Exception{
//
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);
//
OutputStream outputStream = socket.getOutputStream();
FileInputStream file = new FileInputStream(new File("1.jpg"));
byte[] b = new byte[1024];
int len ;
while((len = file.read(b)) != -1){
outputStream.write(b,0,len);
}
//
socket.shutdownOutput();
//
InputStream inputStream = socket.getInputStream();
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
String str = new String(b1,0,len1);
System.out.println(str);
}
inputStream.close();
outputStream.close();
file.close();
} @Test
public void server() throws Exception{
ServerSocket serverSocket = new ServerSocket(9898);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream file = new FileOutputStream("3.jpg");
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
file.write(b1,0,len1);
} OutputStream outputStream = socket.getOutputStream();
outputStream.write(("来自"+socket.getInetAddress().getHostAddress()+"的图片接收成功").getBytes()); outputStream.close();
file.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}

java之网络编程1-Tcp的更多相关文章

  1. Java:网络编程值TCP的使用

    演示TCP传输   1.Tcp分客户端和服务端 2.客服端对应的对象是scoket    服务端对应的对象是serverscoket   客户端: 通过查阅scoket对象,发现在建立对象时,就可以连 ...

  2. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  3. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  4. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  6. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  7. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  8. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  9. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  10. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

随机推荐

  1. Mongos WoW

    http://blog.csdn.net/yuleslie/article/details/7430094 https://github.com/mangostwo/ https://www.getm ...

  2. 听过N次还是不会之:浏览器输入url后到底经历了什么

    有没有这种场景:当你被问起某一项知识点时,你大脑里想起经常看到过这样的问题,可是具体是怎么样就是说不清楚. 好吧,我就是这样的,于是整理一下,实在记不住,以后找起来也方便. 当你在浏览器地址栏里输入一 ...

  3. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  4. SpringMVC实例及注解(二)

    @RequestMapping()除了修饰方法,还可以修饰类1.类定义处:提供初步的请求映射信息.相对于WEB应用的根目录2.方法处:提供进一步的细分映射信息.相对于类定义处的URL.若类定义处未标注 ...

  5. 图像通道、RGB与色彩体系

    通道(Channels) 图像的通道指的是什么?是不是灰度图的通道数为1,彩色图的通道为3 ? 图像通道,在RGB色彩模式下就是指那单独的红色.绿色.蓝色部分.也就是说,一幅完整的图像,是由红色绿色蓝 ...

  6. C:把算术表达式分成Token

    代码: #include "stdafx.h" #include <stdio.h> #include <string.h> #include <st ...

  7. 记一次线上OOM问题分析与解决

    一.问题情况 最近用户反映系统响应越来越慢,而且不是偶发性的慢.根据后台日志,可以看到系统已经有oom现象. 根据jdk自带的jconsole工具,可以监视到系统处于堵塞时期.cup占满,活动线程数持 ...

  8. webstorm中emmet展开a标签和行内元素不换行的解决办法

    大家好我是木瓜太香,大家在使用 webstorm 编写 html 的时候可能会遇到展开部分标签挨在一起的情况,相信很多小伙伴都想解决这个问题,接下来我们就开始吧! 先来看看我们输入如下 emmet 代 ...

  9. Win10 在VM里面装Centos7.4后使用桥接模式连接外网,并用MobaXterm远程虚拟机详细教程

    1.首先登陆虚拟机如图 2.执行ping命令看虚拟机里面的centos7是否可以连网 ping www.baiducom 此时会报错:name or service not known 3.设置一个文 ...

  10. 使用Excel设计fastreport报表

    最近做项目遇到一些报表设计的问题.项目的报表使用 Fast Report,然而该控件调整报表格式比较繁琐,有时候调整某一栏的宽度,整个标题栏都需要调整,且调整以后 还不一定能对齐.客户的很多报表都是基 ...